Perlについての質問箱 30箱目
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2007/03/14(水) 22:54:12"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板 http://pc8.2ch.net/php/ )
CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。
http://www.perl.org/get.html
● 2006/12/21現在の最新版: 5.8.8
● 2006/12/21現在の開発版: 5.9.3
前スレ
Perlについての質問箱 29箱目
http://pc11.2ch.net/test/read.cgi/tech/1166708139/
リンク集は>>2-3
過去スレは>>4
0172デフォルトの名無しさん
2007/04/02(月) 10:46:55インストールしてもうまくいかないんですよ
やりかたが間違ってるかもしれませんが。
説明しているページで、そんなモジュールなかったり。
以下は参考にしたページです。
ttp://sakaguch.com/SetJcodePm.html
win_install.plなんてないし。
マニュアルで置いても、変換後のファイルは0バイトだし。
0173デフォルトの名無しさん
2007/04/02(月) 11:33:15Jcodeインストールするならコマンドプロンプトからppm(今時はppm-shellかな)を起動させて
install Jcode(enter)
で一発で入ると思うが。
0174デフォルトの名無しさん
2007/04/02(月) 11:57:01ありがと
意味不明だけど、勉強してやってみる
0175デフォルトの名無しさん
2007/04/02(月) 12:17:490176デフォルトの名無しさん
2007/04/02(月) 12:23:33でも、うまく動かなった。
これはperlが原因じゃないから
ここで、さよなら。
じゃ、教えてくれた人、ありがと。
0177デフォルトの名無しさん
2007/04/02(月) 12:25:270178デフォルトの名無しさん
2007/04/02(月) 12:31:16webprog板でやってくださいね
0179デフォルトの名無しさん
2007/04/02(月) 13:02:54そのわりに、明確な回答書いてる奴いねーけどな
0180デフォルトの名無しさん
2007/04/02(月) 13:14:06公式のは古いからいつものサードパーティの
所にver.2.06があるからそれをインストールするだけじゃん
0181デフォルトの名無しさん
2007/04/05(木) 09:34:45abcあいうえお123./<>~"@
の様な文字列から日本語だけマッチするもしくはASCIIコードだけマッチさせるようにするには
どうすればよいのでしょうか?
0182デフォルトの名無しさん
2007/04/05(木) 10:12:57文字コードをeucにして、
my $pat = pack("C*",0x20,0x21..0x7e);
/[$pat]+/ でASCII
/[^$pat]+/ で日本語(と制御コード)
0184デフォルトの名無しさん
2007/04/05(木) 20:53:28$_ = 'AAAbarbarbazZZZ'; だとして
@a = /AAA(foo|bar|baz)+ZZZ/;
とすると、@a の中身は最後にマッチした @a = ('baz') 一つとなりますが、
これを @a = ('bar', 'bar', 'baz')
とする正規表現はあるでしょうか?
(){n} でなく ()+ を使ったのは数量が固定ではないためです。
なんらしか正規表現方法で
上記一文で済ませられたら…と思い質問させていただきました。
0185デフォルトの名無しさん
2007/04/05(木) 21:38:28何でも一行に詰め込みゃいいってもんでもないけど…
@a = splice @{[ grep length, split /(foo|bar|baz)/, 'AAAbarbarbazZZZ' ]}, 1, -1;
0186デフォルトの名無しさん
2007/04/05(木) 21:55:26'AAAfooXXbarYYYYYbazZZZ' のように目的外の物が混ざっている場合
のチェックを別にしなければなりませんが。
やはり ()+ でのマッチを正規表現の修正で全部リストする無理でしょうか
0187デフォルトの名無しさん
2007/04/05(木) 22:27:05とかすれば全部とれることはとれる。
リストにはならないけど。
0188デフォルトの名無しさん
2007/04/05(木) 22:29:35> 'AAAfooXXbarYYYYYbazZZZ' のように目的外の物が混ざっている場合
その場合 @a は () とするべきか
AAA foo XXbarYYYYYbazZZZ と分けるべきか
AAAfooXX bar YYYYYbazZZZ と分けるべきか
AAAfooXXbarYYYYY baz ZZZ と分けるべきか
>>184からは読み取れないよ?
0189184
2007/04/05(木) 23:22:15>>187
()+ での一気取得が駄目だった場合、私もそれを候補の一つに考えていました
リストにするには(foo|bar|baz)のマッチングがもう一回必要になってしまいますが
>>188
説明不足でした。申し訳ありませんでした
(ある程度大きいテキストから)
'AAA' と 'ZZZ' の間が (foo|bar|baz)+ のみで構成されている箇所を探し
その部分をリストとして取得したいと思っております
ですので、提示くださった選択肢の中では
>その場合 @a は () とするべきか
を考えています
(foo|bar|baz) の部分は実際はかなり重そうな正規表現の羅列と選択(|)で構成されていて
()+ による繰り返しも回数も非常に多く
(foo|bar|baz) のマッチングによる2度手間(切り出し・リストへ分割)は避けようと思い
今現在は下記の感じの処理を考えています
if (/AAA/) {
while ($' =~ /^(foo|bar|baz|ZZZ)/) {
if ($1 eq 'ZZZ') { OK; last; }
push(@a, $a);
}
}
}
そこで >>184 の質問するに至りました
マッチングも一回で一文で済ませられたら…と
長文失礼
0190184
2007/04/05(木) 23:38:24while ($' =~ //)
は
while ($' =~ //o)
を考えています
今docを読み込んでいるんですが ()+ でのグループの繰り返しマッチングの
全リスト取得は、正規表現工夫しても仕様的に無理なのかな…
0191184
2007/04/05(木) 23:40:39慌てて書き上げたもので
連投すみません
0192デフォルトの名無しさん
2007/04/05(木) 23:44:49AAAの前や、ZZZの後ろは無視していいのか?
0193デフォルトの名無しさん
2007/04/05(木) 23:47:12入力文字列と、それに対する@aの中身はどうなるのか。
0194デフォルトの名無しさん
2007/04/05(木) 23:51:081対の括弧につき1つの値が保存される仕様なんだから、
1回のマッチにおいて1対の括弧で複数個の値を得るのは
そりゃ無理だわな。
それに複雑な正規表現でバックトラックの嵐にするより、
幾つかのシンプルな処理に分けた方が速い。
if (/AAA/g) {
push @a, $1 while /\G(foo|bar|baz)/g;
}
0195デフォルトの名無しさん
2007/04/05(木) 23:52:06まぁ、元のデータの性質が分からんと何とも言えんが。
0196こういうこと?
2007/04/06(金) 00:00:11$x =~ s/(foo|bar|baz)/push @a, $1/ge;
}
0197196
2007/04/06(金) 00:06:160198184
2007/04/06(金) 00:15:33はい。
/AAA(foo|bar|baz)+ZZZ/
これに厳密にマッチするところの(foo|bar|baz)のみを取得したいので
111AAAfooZZZ222 : 111 222 等は要りません
111AAAfooXXXbarZZZ222 : この場合 foo bar も要りません
111AAAfoofoofoobazbarZZZ222 : @a = ('foo', 'foo', 'foo', 'baz', 'bar') を取得したい
>>193
申し訳ありません。実際の入力データはお見せすることが出来ないので、
等価な具体例の作成も時間がかかってしまうかも知れません
上記例でご容赦ください
>>194
>そりゃ無理だわな。
ありがとうございます。
これが出来るのかどうかが一番知りたかったので、ふんぎりがつきました。
実際の具体例のデータを示せないので、(主に速度に関する)お答えは難しいですよね。
その中でも例やヒントを示してくださった方々ありがとうございました。
内部的な処理は詳しくないのですが、試行錯誤しながら参考にさせていただきたいと思います。
皆さんレスありがとうございました。(_ _)
0199デフォルトの名無しさん
2007/04/06(金) 04:08:13どういたしまして
0200デフォルトの名無しさん
2007/04/06(金) 08:54:56わかってやれよな。
0201デフォルトの名無しさん
2007/04/06(金) 09:31:060202デフォルトの名無しさん
2007/04/06(金) 10:26:07$_ = '111AAAfoofoofoobazbarZZZ222';
/AAA(?:(foo|bar|baz)(?{push(@a,substr($&,-3))}))+ZZZ/;
print join(",",@a),"\n";
0203デフォルトの名無しさん
2007/04/06(金) 11:15:130204デフォルトの名無しさん
2007/04/06(金) 11:30:160205デフォルトの名無しさん
2007/04/07(土) 13:27:01# データ内に改行が無ければ最初の二行は
# $_ = <>; で置き換え可能
########################################
chomp(@tmp = <>);
$_ = join '', @tmp;
$re = qr/foo|bar|baz/i;
s!(AAA(?:$re)+ZZZ)!push @a,$1=~/($re)/g !ge;
print join("-", @a);
これはひどい。
0206デフォルトの名無しさん
2007/04/07(土) 13:37:010207デフォルトの名無しさん
2007/04/08(日) 15:55:23ベスト??
車輪の再発明はしない方向で・・・
0208デフォルトの名無しさん
2007/04/08(日) 15:56:59底の変換公式
0209デフォルトの名無しさん
2007/04/08(日) 16:29:00thx
0210デフォルトの名無しさん
2007/04/08(日) 21:57:130211デフォルトの名無しさん
2007/04/08(日) 23:12:16嵌りどころはあるが、「難しい」ではなく「勝手にいじるなよ!」ってな感じ。
Cの派生言語からでも同様。
「難しい」ってのは今までまっとうな言語の経験がないからじゃないかと思う。
0212デフォルトの名無しさん
2007/04/08(日) 23:59:21なんとなく気持ち悪いw
0213デフォルトの名無しさん
2007/04/09(月) 00:12:22Cの原始的な型じゃ、実際にコードを書くときたいして助けになってくれてないだろう。
目糞鼻糞だと思うんだけど。
0214デフォルトの名無しさん
2007/04/09(月) 00:21:03Cだと文字列めんどくせえし、C++と比べても正規表現処理のためのコード量がぜんぜん違うからな。
0215デフォルトの名無しさん
2007/04/09(月) 00:22:52そうでもない。例えばプロトタイプ宣言をちゃんと使っていれば
誤った引数を渡したりしたときなど、コンパイルエラーとして
コンパイルの時点で捕捉出来るし、プロトタイプ宣言自体が
関数の使い方に関する一番簡単なドキュメントになる。
0216デフォルトの名無しさん
2007/04/09(月) 00:27:16テキストをちょろっと弄くるには便利だよね。
クラスやリスト、リファレンス等の基本的な仕組みが
adhoc過ぎて汚いし(←個人的見解)
プログラムが大きくなればなるほど型付静的言語の有り難味が増す。
Perlで小さいプログラム以上のものを書く気にはとてもなれない。
同じ動的言語でも、Pythonあたりならまだ許容量大きいかな。
0217デフォルトの名無しさん
2007/04/09(月) 00:28:33文字列はperlみたいなのが楽だが。
0219デフォルトの名無しさん
2007/04/09(月) 00:41:27バイナリとかバイト/文字単位の処理だとpack(), unpack()の嵐だわな。
それ考えると、文字列処理とか言っても正規表現使いやすいだけって希ガス。
エンコーディング周りもそんなに便利とは言えないし。
0220デフォルトの名無しさん
2007/04/09(月) 06:15:360221デフォルトの名無しさん
2007/04/09(月) 07:43:020222デフォルトの名無しさん
2007/04/09(月) 19:15:26しかし、たとうばHTMLのタグを外す処理を書く ってなった時、
perlなら簡単だけど、Cで書くとなると工程からして憂鬱だ…。
regexp.dll使うけど、メモリリーク等に気を遣わないとで面倒だ…。
0223デフォルトの名無しさん
2007/04/09(月) 20:53:410224デフォルトの名無しさん
2007/04/09(月) 21:53:11まぁCで文字列処理はちょっとな。
どうしても(C++でなく)Cを使う必要があるのなら、せめて
GCライブラリを使いたいところ。
C++なら、文字列処理は別に苦にはならないはず。
それとCで字句/構文解析ならlex/yaccを使う場合も
多いんじゃないかな。
0225デフォルトの名無しさん
2007/04/10(火) 17:49:24ttp://gigazine.net/index.php?/news/comments/20070410_libwww/
0226デフォルトの名無しさん
2007/04/10(火) 18:03:28マジかと思ってUserAgentをlibwwwにしてググったらほんとに検索できなかった。
一時的な効果しか無いだろうに、アホな対応するなぁ…。
これからは適当なAgentを騙れってことでOK?
0227デフォルトの名無しさん
2007/04/10(火) 18:18:390228デフォルトの名無しさん
2007/04/10(火) 19:15:26libwww-perlを拒絶しても、本当に悪い奴は遮断できず、
入門過程の新参者を困惑させ余計な時間をとらせるだけ。
まさに1000害あって1利なし。
0229デフォルトの名無しさん
2007/04/10(火) 19:59:130230デフォルトの名無しさん
2007/04/10(火) 22:32:590231デフォルトの名無しさん
2007/04/10(火) 22:39:480232デフォルトの名無しさん
2007/04/10(火) 22:59:000233デフォルトの名無しさん
2007/04/11(水) 00:55:09んなもんどうでもなるやん。何の意味があるのかさっぱりわからん。
0234デフォルトの名無しさん
2007/04/11(水) 01:45:440235デフォルトの名無しさん
2007/04/11(水) 10:26:47少しお尋ねします。
例えば
perl -pi.bak -e "tr/A-Z/a-z/"*.html
とか便利ですよね?
これを.plとして使いたいのですが無理なのでしょうか?
コマンドラインから打ち込むしか手がないのでしょうか?
0236デフォルトの名無しさん
2007/04/11(水) 10:40:03perlrun(1)の-iオプションの説明のとこに例があるだろ。よく嫁。
From the shell, saying
$ perl -p -i.orig -e "s/foo/bar/; ... "
is the same as using the program:
#!/usr/bin/perl -pi.orig
s/foo/bar/;
which is equivalent to
#!/usr/bin/perl
$extension = '.orig';
LINE: while (<>) {
if ($ARGV ne $oldargv) {
(改行大杉でおこられるので以下略)
0237デフォルトの名無しさん
2007/04/11(水) 10:40:50http://pc11.2ch.net/test/read.cgi/tech/1173880452/235
0238デフォルトの名無しさん
2007/04/11(水) 10:49:06アリガトウございます。
なお、質問するスレが似つかわしくないと重い他スレにも同じ内容を質問させていただきましたが
ご迷惑かけたようで申し訳ないです。
0239デフォルトの名無しさん
2007/04/11(水) 11:06:13windowsだとどうも面倒なようなので他の手にします。お騒がせしました。
0240デフォルトの名無しさん
2007/04/11(水) 11:33:56与えたperlをsystemかexecで起動するようなスクリプト書く
手もあるよ。
病的に効率を気にする人にはお勧めしませんけど。
0241デフォルトの名無しさん
2007/04/11(水) 21:53:06Windowsなら.batに書けばいいんじゃね?
なんで.plにこだわるのかわからん
0242デフォルトの名無しさん
2007/04/11(水) 22:50:120243デフォルトの名無しさん
2007/04/11(水) 23:15:280244デフォルトの名無しさん
2007/04/12(木) 01:10:07馴れ合いなので、聞く必要なし
0245デフォルトの名無しさん
2007/04/12(木) 04:01:25見事になんにもなし。
0246デフォルトの名無しさん
2007/04/13(金) 05:01:57ありがとうございます。
>>241
いえ。こだわってないから他の手にするつもりです。
UNIX環境でないとなかなか不便なものなんですね。
0247デフォルトの名無しさん
2007/04/13(金) 22:58:40>UNIX環境でないとなかなか不便なものなんですね。
この点は同意なんだけどね。
しかし、キミが不便だと言っている点についてオレは不便を感じたことはないな。
0248デフォルトの名無しさん
2007/04/14(土) 00:31:00てかperlの質問じゃなくて、コマンドラインについての質問だよな・・・
0249デフォルトの名無しさん
2007/04/14(土) 13:30:37>しかし、キミが不便だと言っている点についてオレは不便を感じたことはないな。
主観的且つ感情的な意味でしょうか?そうではないとしたら何か理由がおありですよね?
不便と思わない理由はなんでしょうか?
>>248
スレ違いになるかもですね。
そろそろ退散したいと思います。
0250デフォルトの名無しさん
2007/04/14(土) 13:32:25?
0251デフォルトの名無しさん
2007/04/14(土) 17:11:52# >>235 の望みを叶える夢のスクリプト:
exec 'perl', '-pi.bak', '-e "tr/A-Z/a-z/"', shift;
__END__
0252デフォルトの名無しさん
2007/04/14(土) 22:29:21頭大丈夫?
0253デフォルトの名無しさん
2007/04/14(土) 22:41:39間抜けな質問というしかない。
0254デフォルトの名無しさん
2007/04/14(土) 22:55:57@a = grep {/(foo|bar|baz)/} split /(foo|bar|baz)/ , $_;
0255デフォルトの名無しさん
2007/04/14(土) 23:30:26会社のHP作成を引き継いだのですが、わからないことがあるのでどなたか教えていただけないでしょうか。
コンボボックスを外部のテキストから読み込んでいるのですが、途中までしか表示されないのです。
0<>--<><>
1<>A<><>
2<>B<><>
3<>C<><>
4<>D<><>
5<>E<><>
6<>F<><>
7<>G<><>
8<>H<><>
(中略)
14<>N<><>
上記が外部テキストの中身なのですが、コンボボックスには8までしか表示されないのです。
コンボボックスの方は
#編集モード以外は表示するだけ、編集モード時はコンボボックスで表示
if (!$edit) {$html .= "<td align=\"center\"><table width=\"100%\">";
for ($l = 0; $l < $periods; $l++) {
if ($showpname) { $html .= "<tr><td>$periodname[$l]</td>"; }
$html .= "<td align=\"center\">$STATUSSTR[$stats[$l]]</td></tr>";}
$html .= "</table></td>\n";}
となっています。
全てを表示させるようにするにはどこを変えたらいいのでしょうか。
(これだけの情報では不十分でしたらすみません。
他にどんな情報が必要かも教えていただければ幸いです)
Perl関連の本など読んでみたのですがわからなくて…
宜しくお願いします。
0256デフォルトの名無しさん
2007/04/14(土) 23:36:540257デフォルトの名無しさん
2007/04/14(土) 23:48:58あ、もしかしてここは関係なかったですかね…
カレンダーの1日ごとにコンボボックスが入っているので、そのカレンダーの方のコードなんでしょうか…
わからないことだらけのまま質問してしまってごめんなさい。
もう一度コードを見直してみます。
0258デフォルトの名無しさん
2007/04/14(土) 23:53:55perlコードの、$periods、$showpname・・・とやらが何なのかわからないと
何もアドバイス出来ないよ。
0259デフォルトの名無しさん
2007/04/15(日) 00:03:49そうですか…
$periodsなどなどは専門用語なのかなぁ、と思っていたのでそこから間違いだったのですね。
前任者とは全く連絡が取れず、初心者の私には何がなにやらさっぱりで…
失礼致しました。
もっと勉強して出直します!
0260デフォルトの名無しさん
2007/04/15(日) 00:23:130261デフォルトの名無しさん
2007/04/15(日) 00:39:39期間…カレンダー関係ですかねぇ。
日ごとにアルファベッドを選択して登録するんですけど、
何ヶ月か分をまとめて登録してそれをScriptで(?)違うページに呼び出すので、それですかねぇ…
それにしても8番までしか出てこないのもどこかで指定してるんですかねぇ。
あまりにファイルが多すぎて、探すのに時間がかかりそうです…
0262デフォルトの名無しさん
2007/04/15(日) 00:52:49本当にそのコードが該当コードなのかどうか怪しいね
ありうるとすれば@STATUSSTRの中が"<select>…"といったhtmlになってるとか
とりあえずPerlの配列変数は先頭の記号が $ だったり @ だったりするので
それだけ注意して変数をさかのぼって行くとか
お節介だけど$showpnameのif文、通らない場合に開始<tr>タグ欠けるよ
0263デフォルトの名無しさん
2007/04/15(日) 01:03:420264デフォルトの名無しさん
2007/04/15(日) 01:56:12エスパーのおいらが予測するには、>>255 が挙げた箇所の次に
} else {
という行があり、その後の部分が問題の部分なんだろうな。
0265デフォルトの名無しさん
2007/04/15(日) 06:52:58「type="select"」あたりで検索すれば、該当個所の近辺の
コードに当たるんじゃないか?
0266265
2007/04/15(日) 06:55:310267デフォルトの名無しさん
2007/04/15(日) 23:51:49実は前任者さん、その書き込みの様子をモニターを通して見ておりました。
では、心に引っかかっていた辛い過去。
あの時、伝えられなかった想いを今、、、
0268デフォルトの名無しさん
2007/04/16(月) 00:50:06これからの初心者は、今の時代に合った言語を使ってくれ・・・
・・以上
0269デフォルトの名無しさん
2007/04/16(月) 00:53:480270デフォルトの名無しさん
2007/04/16(月) 01:04:26Whitespaceだろ。
0271デフォルトの名無しさん
2007/04/16(月) 04:53:46Perlは消えなくていい。PHP、頼むから消滅してくれ。
■ このスレッドは過去ログ倉庫に格納されています