Perlコーディング初心者質問スレ Part 56
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001nobodyさん
2007/09/16(日) 19:49:43ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >2 以降
前スレ ttp://pc11.2ch.net/test/read.cgi/php/1180492441/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
08601/2
2008/02/01(金) 03:03:29ID:???途中まで書いてまじめにやると面倒だという事は分かった。
あとは頑張ってくれ。
#!/usr/bin/perl -w
use strict;
my $str = 'This... This is, This is a pen.';
my @target = ('This', 'This is', 'is a pen');
my $tag_o = '<font color="#ffff00">';
my $tag_c = '</font>';
my $tag_r = qr|</?font[^>]*>|;
my $tag_e = qr/(?:(?!$tag_r).)*/s;
for (@target) {
my $re = join qr/(?:$tag_r)*/o, split /(\s+)/;
$str =~ s/($re)/add_tag($1)/eg;
}
print $str;
08612/2
2008/02/01(金) 03:04:31ID:???my $substr = $_[0];
if ($substr !~ /$tag_r/o) {
$substr = "$tag_o$substr$tag_c";
} elsif ($substr !~ /\Q$tag_o\E/o) {
$substr =~ s/(\Q$tag_c\E)/$1$tag_o/go;
$substr .= $tag_c;
} elsif ($substr !~ /\Q$tag_c\E/o) {
$substr =~ s/(?=\Q$tag_o\E)/$tag_c/go;
substr($substr, 0, 0) = $tag_o;
} elsif ($substr =~ /^($tag_e)\Q$tag_c\E($tag_e)\Q$tag_o\E($tag_e)\z/o) {
$substr = "$1$2$3";
} elsif ($substr =~ /^($tag_e)\Q$tag_o\E($tag_e)\Q$tag_c\E($tag_e)\z/o) {
$substr = "$tag_o$1$2$3$tag_c";
} else {
die $substr; # ココを頑張ってくれ。
}
$substr =~ s/\Q$tag_c$tag_o\E//go;
$substr;
}
0862nobodyさん
2008/02/01(金) 04:53:15ID:hS8kNEG7{
$page_dsp .= <<"EOM";
<tr>
<td colspan="2" >
<form action="????.cgi" method="post" onSubmit="return send_check()">
<select name=ku class=slc>
<option value="no">
EOM
#この中の条件式(ifの条件付オプション)は省略
{$page_dsp .= "<option value=\"1\">\n"; }
$page_dsp .= <<"EOM";
</select>
<input type=hidden name=back value="no">
<input type=hidden name=id value="$kid">
<input type=hidden name=pass value="$kpass">
<input type=hidden name=mode value="ku">
<input type=submit class=btn value="オン">
</td></form></tr>
EOM
}
else{$page_dsp .= "<tr><td colspan=2 align=center>終わり</td></tr>\n";
}
以上のように、最初の5つの条件
(各々全部の、左の数値が右の数値と同じかそれ以上の時にセレクトを非表示)
で動かしたいのですけど、5つの条件中3つの条件しか満たしてないのに非表示に
なります。
条件が5つ揃ってから非表示にするにはどうすればいいですか?
ご教授お願いします。
0863nobodyさん
2008/02/01(金) 05:30:16ID:???0865nobodyさん
2008/02/01(金) 16:52:45ID:hS8kNEG7最初の5つの命令との相性が悪かったからかもしれませんね。
省略した部分内には、最初の5つの命令を一個ずつ(計5個)指定して、条件が満たされるごとに
オプション項目が一つずつ消えていき、全部満たしたら最初の5つの命令でセレクト
ごと非表示にするつもりでいたんです。
0866nobodyさん
2008/02/01(金) 16:54:10ID:???0867nobodyさん
2008/02/01(金) 16:55:34ID:???相性が悪かったということだな
0869nobodyさん
2008/02/02(土) 05:09:34ID:???今年に入ってからいろいろと求人情報を集めてみたところperlの仕事少ないですね
噂には聞いてましたが、僕は何が何でもperlを仕事にしたいのです
まあそれはおいといて、perlを仕事としてみたときどんな感じですかね?
皆さま先輩方の多くはperlを仕事としていらっしゃると思ったので、
是非とも業務内容、他言語と比べたときの待遇、仕事のやりがいなどなど、
ポジティブな意見(勧め)もネガティブな意見(愚痴)も生の声としてお聞かせ願えればと存じます。
仕事の中でperlを使うことはたくさんの現場であるです。
おいらは今、製造業の中でperlを利用しています。
昨今の機器はLANでデータを採取できたりします。
それを高ぁーいWindows専用のアプリでデータ加工することなく、unix(含むlinux)なサーバにてcronでデータ採取・計算・加工してDB(DB_Fileで充分)に登録。(もちろんperlで)
そいつを拾ってエクセルに貼り付けるだけ(もしくはSpreadsheet::Writeで書き込むも良し)でもデータの共有が出来たりします。
記録計のようなグラフを作るにしてもGDだけで充分。
部品の計測をするのでも、今時のマイクロメータは数値をUSBで送ってくれる物があったりします。(USBテンキーみたいな出力をしたりする)
それをExcelにちまちま放り込むよりか、単純テキスト(csvでも良いけれども)で保存して、perlを使っていろんな形や計算をさせることも出来たりします。
以前勤めていたWEB屋(主にデザインやHTML書き)でも、Excelのデータを1件1HTMLファイルに変換する作業がありました。
(その求人に応募したのだ(照))
3000件近いデータを変換すると云うことで、2-3か月近い工程を組まれていたことがありました。
どうやら手動で書き換え作業をと目論んでいたようです。
けれどもデータ構造と特性を見極めるのに2日、それを変換するperlスクリプトを2日、変換作業たったの10秒って事がありました。
その当時、その部署の長は目を丸くしていましたです。
まだまだperl=CGIっていう感覚で居られたからです。
その後、ちまちまと元データ(Excel)の修正が入ってきても数秒で修正完了。
デザイン変更があってもテンプレートを書き換えるだけでおしまい。
あまった2-3か月の期間、他の仕事を色々とこなしていました。
ようは仕事に使う道具の1つとしてperlというのを持っていればどんな業種にでも使えるんじゃないかな。
そんなこともあって製造業の現場であるにもかかわらず、おいらのところにだけは使い慣れたMacOSX(iMacG5)なんてのを無理を聴いて貰って備え付けましたですです♪
0871nobodyさん
2008/02/02(土) 11:18:13ID:???高卒で十分な土方に好き好んで修士雇う経営者がいるのか?
0872nobodyさん
2008/02/02(土) 11:21:37ID:???そんなこともわからないのか?
0873nobodyさん
2008/02/02(土) 12:03:51ID:???高卒で足りる仕事には高卒の賃金しか払わないという事だよ。
0875nobodyさん
2008/02/02(土) 13:33:00ID:???0876nobodyさん
2008/02/02(土) 13:46:46ID:???個人的にはなにがなんでもPerlとかいってるPerl使いは嫌だけど
0877nobodyさん
2008/02/02(土) 14:25:02ID:???>>874
それ公務員ね。試験区分に対象の学歴があってそれに沿うことが望ましいとされてるから。
というかこれマ板のネタだろ。
0878perl好き情報3回生(本物) ◆qqt5.0NxB6
2008/02/02(土) 14:40:08ID:???僕はWebprog板に>>869と同一内容の書き込みをした者です。
>>869は偽者であって僕がマルチポストをしたのではないことを明言しておきます。
トリップをつけたので本物しか相手をしないようお願いいたします。
迷惑をおかけして申し訳ありません。
お騒がせしました。
0879nobodyさん
2008/02/02(土) 15:45:41ID:???一部の記号(それも機種依存文字含む)が文字化けします。
− → \x{ff0d}
o → \x{339c}
機種依存文字に関しては、根本的に対応することに意味があるのか疑問ですが、せめてwindowsな環境で
文字化けしないようにしたいのです。どうしたらいいでしょうか?
あんまし分かっていませんが、重要そうな部分だけ。
use XML::RSS;
use LWP::Simple;
use encoding 'euc-jp', STDOUT => 'euc-jp';
use open IN => ":encoding(euc-jp)";
use open OUT => ":encoding(euc-jp)";
binmode OUT => ":encoding(euc-jp)";
my $rss = new XML::RSS;
$rss->parsefile($site_file);
my $item_list = $rss->{'items'};
$item = ${$item_list}[0];
my $desc = $item->{'description'};
#一応対策っぽいことをやって一部の記号には対応できた
$desc =~ tr/\x{005C}\x{00A5}\x{2014}\x{203E}\x{2225}\x{FF0D}\x{FF5E}\x{FFE0}\x{FFE1}\x{FFE2}/
\x{FF3C}\x{FFE5}\x{2015}\x{FFE3}\x{2016}\x{2212}\x{301C}\x{00A2}\x{00A3}\x{00AC}/;
0880879
2008/02/02(土) 15:48:16ID:???〜 → \x{FF5E} に化ける問題は、一番下に書いた置換で解決したのですが、\x{FF0D}は何故かそのまま
文字化けしたままです…
0882879
2008/02/02(土) 15:57:31ID:???hogehoge.cgi: "\x{ff0d}" does not map to euc-jp at hogehoge.cgi line 183.
0883nobodyさん
2008/02/03(日) 01:13:34ID:???perl使ってるところはライブドアとかはてなとか高レベルに使いこなしてるところばっかり。
初〜中級のところは全部PHPになってしまった。
0884nobodyさん
2008/02/03(日) 03:35:42ID:???0885nobodyさん
2008/02/03(日) 11:14:58ID:???あとはPEARとかを使いこなせればいいわけだから、Perlの基礎がある
のなら、1週間程度で、出来るといえるんでね?
Perlで作ったコードをPHPに移植して、これ、私が作りました、みたいな。
0886nobodyさん
2008/02/03(日) 12:57:34ID:???0887質問
2008/02/03(日) 13:04:56ID:34/ZwImQ項目を選択しボタンをクリックすると、あるページには選択した項目の画像ファイルを表示し、
もうひとつのページにはその選択した項目を表示させたいのですがどうしたらよいでしょうか?
最初のページには
<form action="A.cgi" target="表示させたいページ">
を埋め込んでいるのですが、当たり前ですがこれだと"表示させたいページ"にしか表示できません。
A.cgiのなかでさらにこの部分だけは他のページへ表示させるとかできませんか?
0889nobodyさん
2008/02/03(日) 14:12:18ID:???それは、Perlの話じゃなくて、htmlの話じゃないの?
フレームタグを使って区切るか、テーブルタグを使って全部を表示させる方法がある。
板違いなので、これ以上の質問はしないように。
0890nobodyさん
2008/02/04(月) 03:22:50ID:???メッセージのとおりで、変換表に該当するものがないんでしょ。
euc-jpMSとか使わないといけないんじゃないの?
0891nobodyさん
2008/02/07(木) 12:55:00ID:???CentOS 5.1
「out of memory」のときのエラーハンドリングの方法を教えてください。
dieのときは
$::SIG{__DIE__} = sub {〜〜〜};
でいけることまではわかったのですが
「out of memory」がハンドリングできないのです。
よろしくおねがいします
0892nobodyさん
2008/02/07(木) 15:49:01ID:???それができないのなら、OSの制限上げる。メモリ積む。
0893nobodyさん
2008/02/07(木) 19:10:28ID:???my @value=(0,1,3,8); #任意のkey
my @hoge=('hoge1','hoge2','hoge3'....); #表示用配列
my $disp;
foreach (@value)
{
$disp .= ',' if $disp;
$disp .= $hoge[$_];
}
という処理をしているんですが、これってJOINでできませんか?
map使ってもこれより簡単に書けないですよね?
0894nobodyさん
2008/02/07(木) 19:28:15ID:???my @value = (0, 1, 3, 8);
my @hoge = ('hoge1', 'hoge2', 'hoge3', 'hoge4', 'hoge5', 'hoge6', 'hoge7', 'hoge8', 'hoge9');
print join ',', @hoge[@value];
0896nobodyさん
2008/02/08(金) 09:47:17ID:???my $value = "0,1,3,8";
my @hoge = ('hoge1', 'hoge2', 'hoge3', 'hoge4', 'hoge5', 'hoge6', 'hoge7', 'hoge8', 'hoge9');
これは
join ',',@hoge[sprit',',$value];
ですよね?
splitしてjoinして勿体無い感じ。。
0897nobodyさん
2008/02/08(金) 10:08:10ID:???0898nobodyさん
2008/02/09(土) 18:24:58ID:???0899nobodyさん
2008/02/11(月) 09:15:09ID:7AZat8M4my $endline = $. while (<FH>);
としてとりえず取得できたんですが、
その後
seek FH,0,0;
として、また1行目から別の処理したいんですがうまくできません。
seekの戻り値をprintしてみると1を返してますが、先頭には戻ってないようです。
windows環境なのが原因でしょうか?
0900nobodyさん
2008/02/11(月) 09:31:45ID:???seekしても$.はリセットされないから先頭に巻き戻したら$.= undefとかすればいい
0901nobodyさん
2008/02/11(月) 11:26:23ID:???>局所化
あ、ほんとだ。ミスってました。
undef $.;
reset $.;
それぞれ試してみましたが変化ありませんでした。
その後に
while (<FH>) {
if ($. == $bigin .. $. == $end) {
といった処理をしたいんですが、どうもうまくいきません。
0902nobodyさん
2008/02/11(月) 11:49:03ID:???ありがとうございました。
0903nobodyさん
2008/02/12(火) 21:28:15ID:???utf-8から7bitJISへの変換なのですが、(メール送信のため)
Encode.pmもJcode.pmもローマ数字をJISにしてくれません。
Encodeでは「\x{2160}」と変換不可の場合のユニコード値に変換され、
Jcodeでは「?」になります
T(ローマ数字1)
\xE2\x85\xA0 utf8 → \x1B\x24\x42\x2D\x35 JIS
と手動で変換してやれば良いのですが、escシーケンスの処理がどうしたものかと・・・
0904nobodyさん
2008/02/12(火) 23:23:01ID:???のように相対パスを使うと出来るけど
use lib '/i/cgi-bin/lib';
のように絶対パスを使うと動かなくなります
サーバーの設定によって絶対パスだと読み込めなかったりするんでしょうか
普通のリンクだと絶対パスでリンクできます
0906nobodyさん
2008/02/13(水) 02:37:13ID:???perlから使う絶対パスはwebサイト上の絶対パスじゃないよ。
・ http鯖がルートとして扱うディレクトリからの絶対パス
・ 鯖のOSの絶対パス
の違いを理解しような。
0907nobodyさん
2008/02/13(水) 02:39:50ID:???JISとかISO-2022-JPにはローマ数字はないから。
Encode::EUCJPMS - Microsoft Compatible Encodings for Japanese - search.cpan.org
http://search.cpan.org/~naruse/Encode-EUCJPMS-0.07/EUCJPMS.pm
あたりをいれて、cp50220 とか cp50221 で変換する。
0908906
2008/02/13(水) 10:48:35ID:???調べてみます
0910nobodyさん
2008/02/13(水) 12:25:12ID:???ありがとうございます
Encode::EUCJPMSモジュールをいれて、
use Encode::EUCJPMS;
use Encode;
my $cp50220_str = Encode::from_to( $utf8_str , "UTF8" , "CP50220" );
で良いのでしょうか?
実はフォーム入力はShiftJISでして、CP932からutf-8に一旦エンコードしています。
これで問題はないでしょうか?
0912nobodyさん
2008/02/14(木) 10:56:12ID:AY3pAm1W#!/usr/bin/perl
use strict;
print "IEを起動します...\n";
system("C:/Program Files/Internet Explorer/iexplore.exe");
exit;
__END__
上のようにすると、IEは起動するのですが、コマンドプロンプトは残ったままで
タスクマネージャーにも perl.exetが残っています。(残るというか待ってるようですが…)
IEを起動したあとはPerlも終了して欲しくて検索したらexecというのがあったので
exec("C:/Program Files/Internet Explorer/iexplore.exe");としたら起動しませんでした。
IE起動後速やかにPerlを終了させるにはどうすれば良いでしょうか。
PerlはActivePerl 5.8.8をインストールしました。
もう一つは、my $url = 'http://www.google.co.jp/'; とした時に
IEにこの$urlを開かせるにはどうすればよいのでしょうか。よろしくお願いします。
0913nobodyさん
2008/02/14(木) 11:58:11ID:???0915nobodyさん
2008/02/14(木) 12:27:34ID:???/ ::::::::::::::::\ つ
. | ,,-‐‐ ‐‐-、 .:::| わ
| 、_(o)_,: _(o)_, :::|ぁぁ
. | ::< .::|あぁ
\ /( [三] )ヽ ::/ああ
/`ー‐--‐‐―´\ぁあ
0916910
2008/02/14(木) 12:58:24ID:???ありがとうございます。
「〜」は手動でE3 80 9Cに置き換えています。
では教えていただいた方法でやってみようと思います。
0917nobodyさん
2008/02/14(木) 15:13:40ID:???Net::SMTPについて教えて下さい
use Net::SMTP;
my $smtp = Net::SMTP->new( $mailhost );
$smtp->mail( $MailFrom );
$smtp->to( $MailTo );
$smtp->data();
$smtp->datasend( "From: $MailFrom\n" );
$smtp->datasend( "To: $MailTo\n" );
$smtp->datasend( "Subject: $e_subject\n" );
$smtp->datasend( "Mime-Version: 1.0\n" );
$smtp->datasend( "Content-type: text/plain; charset=ISO-2022-1\n" );
$smtp->datasend( "Content-transfer-encoding: 7bit\n" );
$smtp->datasend( "Reply-to: $MailFrom\n" );
$smtp->datasend( "$body\n" );
ここでbodyに例えばtestdataと入れると$bodyもメールとして届くのですが、
$bodyをtest:dataとする(半角コロンが入っている)と、$bodyが送られません
何が悪いのかご教示下さい
0918nobodyさん
2008/02/14(木) 15:18:19ID:???0919nobodyさん
2008/02/14(木) 15:28:13ID:???0921919
2008/02/14(木) 15:57:21ID:???よかったな。
バグった状態だと$bodyが送られてこないんじゃなくヘッダに入ってたはず。
メールヘッダと本文の切り分けは「半角コロンが入ってない行が登場した所から本文」って事になってるから、
どんな文が入るか分からん時は、ヘッダの最後に空行を入れれば桶。基本なんで覚えとくと便利。
0923nobodyさん
2008/02/17(日) 21:47:50ID:???ヘッダと本文は空行で分けられます。
ついでに言うと、改行は CRLF (\r\n) にすること。
MTA によっては受け付けてくれません。
0924exe
2008/02/19(火) 11:44:47ID:L1DAdjnkaAbBcCdDeE・・・yYzZ のような形です。お願いします。
0925nobodyさん
2008/02/19(火) 12:05:44ID:???0926nobodyさん
2008/02/19(火) 12:06:11ID:???を10個コピペでおk
0927exe
2008/02/19(火) 14:24:58ID:L1DAdjnk0928nobodyさん
2008/02/19(火) 14:25:28ID:???for(65..90) {
print pack("C*",$_);
print pack("C*",$_+32);
}
print "\n";
}
0929exe
2008/02/19(火) 14:42:37ID:L1DAdjnkちなみに↓の形で書くと、どうしたらよいでしょうか。
何度もすいません。
open (FILE, '>test1.txt') or die "$!";
for my $count (0..9) {
for my $i ("a".."z") {
}
print FILE "\n";
}
close(FILE);
0930nobodyさん
2008/02/19(火) 14:59:33ID:???# $countってなんぞ?
#
open (FILE, '>', 'test1.txt') or die "$!";
binmode(FILE);
for my $count (0..9) {
for my $i('a'..'z') {
print $i;
print uc($i);
}
print FILE "\n";
}
close(FILE);
0931nobodyさん
2008/02/19(火) 15:01:42ID:???# ↑はウソ
#
open (FILE, '>', 'test1.txt') or die "$!";
binmode(FILE);
for my $count (0..9) {
for my $i('a'..'z') {
print FILE $i;
print FILE uc($i);
}
print FILE "\n";
}
close(FILE);
0932exe
2008/02/19(火) 15:06:17ID:L1DAdjnk0933exe
2008/02/19(火) 15:54:07ID:L1DAdjnk自力でやらないといけないのはわかっているのですが、時間がなくて・・どなたかお願いします。
0934nobodyさん
2008/02/19(火) 16:04:55ID:???# そういうウンコみたいな仕事を漏れにも回してくれよ
#
$sent = 'dTgZtyYthSGetLt';
$sent =~ s/[a-z]//g;
print $sent;
0935nobodyさん
2008/02/19(火) 16:31:12ID:???0936exe
2008/02/19(火) 16:55:41ID:L1DAdjnk自分にとっては色々難しくて。時間もありませんでしたので・・
0937nobodyさん
2008/02/19(火) 17:15:11ID:???OPEN("http://www.aa.com/a.cgi") みたいにして
a.cgiの出力結果を元にさらに処理をしたいと思っています
0938nobodyさん
2008/02/19(火) 17:30:48ID:gLoGL0Aeいい手じゃないが、Linuxでwgetが入ってる状態で漏れが使ってる方法
$foo = `wget -O- http://www.aa.com/a.cgi`;
0939nobodyさん
2008/02/19(火) 17:45:18ID:???0940nobodyさん
2008/02/19(火) 17:55:56ID:???0942938
2008/02/19(火) 20:13:58ID:???モジュール使った方が互換性高いし、そっちの方が良いと思ったんで。
>940のLWPを使うのが最良だと思うが、使い方調べてる気分的な余裕がないんで、
wget使ってそのまま今に至る感じだ。
>941
外部コマンド実行だから。``で囲むと外部コマンドを実行して標準出力が戻ってくる。
ちなみに"perl -T"でやってると、そのままじゃ外部コマンド動かない事があるんで注意。
$ENV{'IFS'}, $ENV{'CDPATH'}, $ENV{'ENV'}, $ENV{'BASH_ENV'}, $ENV{'PATH'}を
退避・削除してから外部コマンドを実行し戻す必要がある。
0943nobodyさん
2008/02/19(火) 20:26:04ID:???0944nobodyさん
2008/02/20(水) 08:23:23ID:???http://search.cpan.org/~gaas/libwww-perl-5.808/lib/LWP/Simple.pm
0946nobodyさん
2008/02/20(水) 13:15:09ID:???そのURLのページにキーワードか書かれているかどうか調べるとき、
foreach (@url) {
LWPで取得してキーワードが見つかったら、$count++;
}
みたいにすると一つずつなので物凄く時間が掛かります。
10個くらい一気に取得する方法はないでしょうか?
0947nobodyさん
2008/02/20(水) 13:35:03ID:???0948nobodyさん
2008/02/20(水) 13:43:09ID:???0950nobodyさん
2008/02/20(水) 14:34:00ID:???0951nobodyさん
2008/02/20(水) 15:01:34ID:???プロセスBは重いサイトがリストにあって終わってないとか
無駄に待ち時間増えるから、threads使える環境ならthreadsのが楽でない?
0952nobodyさん
2008/02/20(水) 15:03:07ID:???正規表現について教えてください。
通常の2バイト文字と同様に絵文字[\x75-\x7B][\x21-\x7E]がエスケープシーケンス
\x1b\x24\x42と\x1b\x28\x42に囲まれます。
エスケープシーケンスをそれぞれ
$esc_in = "\x1b\x24\x42";
$esc_out = "\x1b\x28\x42";
とし、絵文字を
$emoji = "[\x75-\x7B][\x21-\x7E]";
とします。
元の文を
$str="今日は晴れでした■気温は10度です。";(■は笑顔の絵文字 \x79\x79 )
この$strは
$esc_in今日は晴れでした■気温は$esc_out10$esc_in度です。$esc_out
とエスケープされます。
やりたい事はこれを
$esc_in今日は晴れでした$esc_out[7979]$esc_in気温は$esc_out10$esc_in度です。$esc_out
というように[]で絵文字コードを囲い、エスケープシーケンスの整合性をとるというものです。
どなたかご教授いただけないでしょうか?
0953nobodyさん
2008/02/21(木) 00:49:43ID:???0954nobodyさん
2008/02/21(木) 02:07:00ID:???いったんutf8文字列にしてから加工して戻す方がたぶん見通しいいよ。
0955952
2008/02/21(木) 03:31:08ID:???ありがとうございます。そちらの方で検討させていただきます。
このような複雑な置換について私は苦手でして、もしこれがお分かりになられるなら後学のためにも教えていただきたいのですが、ご無理でしょうか?
0956nobodyさん
2008/02/21(木) 10:36:05ID:???マッチした文字列はルールに沿って変換
ってことかな?
0957nobodyさん
2008/02/21(木) 10:36:46ID:???○$esc_inと$esc_outで囲って
0958nobodyさん
2008/02/21(木) 10:39:56ID:???# 絵文字部分を1文字ずつ加工。
# 1バイトずれてマッチしたり、ascii部分にマッチしないようにしてるので面倒
$str =~ s{
(
(?:\G | ^[^\1b]*\x1b\x24\x42)
(?:[^\x1b]{2}|\x1b\x28\x42[^\x1b]*\x1b\x24\x42)*?
)
([\x75-\x7b])([\x21-\x7e])
}{
sprintf "%s\x1b\x28\x42[%02x%02x]\x1b\x24\x42", $1, ord($2), ord($3)
}gex;
# 冗長なエスケープシーケンスの並びを除去
$str =~ s/(\x1b\x24\x42)+/$1/g;
$str =~ s/(\x1b\x28\x42)+/$1/g;
$str =~ s/\x1b\x28\x42\x1b\x24\x42//g;
$str =~ s/\x1b\x24\x42\x1b\x28\x42//g;
レス数が950を超えています。1000を超えると書き込みができなくなります。