Perlについての質問箱 28箱目
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/10/31(火) 14:52:21"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/10/31現在の最新版: 5.8.8
● 2006/10/31現在の開発版: 5.9.3
前スレ
Perlについての質問箱 27箱目
http://pc8.2ch.net/test/read.cgi/tech/1157874614/
リンク集は>>2-3
過去スレは>>4
0263デフォルトの名無しさん
2006/11/14(火) 02:39:27> 独習終えたら何を読むといいですかね?
主要モジュールや最近バリバリ書かれているとんがったシステムのソースコード。
0264デフォルトの名無しさん
2006/11/14(火) 02:42:13> hashのkeyに半角の空白を含む日本語を入れてvalueに数値を入れると
ホントか? ホントにそう書いてあるか?
0265デフォルトの名無しさん
2006/11/14(火) 02:54:07hashに 「ホゲホゲ 5」 をいれて
keyに 「10」 を入れた時に以下のエラーが出ます。
日本語の取り扱いが間違ってるのでしょうか?
Argument "M-^CzM-^CQM-^CzM-^CQ 5" isn't numeric in array element at ./a.pl line 32, <> line 1.
0266デフォルトの名無しさん
2006/11/14(火) 03:07:060267265
2006/11/14(火) 03:16:46#!/usr/bin/perl -w
# hash----------------------------
%cn2p;
while(<>){
chomp;
# print "$_\n";
@words = split;
# print "n1 $words[0]\n";
# print "n2 $words[1]\n";
# print "n3 $words[2]\n";
$tmp = $words[1] . " " . $words[2];
$cn2p[$tmp] += $p;
}
0268265
2006/11/14(火) 03:18:44間違い。
簡略化したのでエラーが出るのは最後の行です。
10 ホゲホゲ 5
と言うのをファイルから読ませています。
#!/usr/bin/perl -w
# hash----------------------------
%cn2p;
while(<>){
chomp;
# print "$_\n";
@words = split;
# print "n1 $words[0]\n";
# print "n2 $words[1]\n";
# print "n3 $words[2]\n";
$tmp = $words[1] . " " . $words[2];
$cn2p[$tmp] += $words[0];
}
0269デフォルトの名無しさん
2006/11/14(火) 03:21:21Argument "M-^CzM-^CQM-^CzM-^CQ 5" isn't numeric in array element at ./a.pl line 32, <> line 1.
って、配列の添字に数値じゃないのが入れられてるっていうエラーなんだが。
0270デフォルトの名無しさん
2006/11/14(火) 03:21:56答えを言うのはもったいないので、とりあえず use strict してみようよ。
0271265
2006/11/14(火) 03:28:11hashには数値以外も入れられるんじゃないのでしたっけ?
0272デフォルトの名無しさん
2006/11/14(火) 03:29:44あなたのコードには、hashは存在しません。
0273265
2006/11/14(火) 03:32:54わかりました!
ありがとうございます。
0274デフォルトの名無しさん
2006/11/14(火) 03:46:09答え言っちゃダメでしょw
0275デフォルトの名無しさん
2006/11/14(火) 04:51:23全員が君みたいな性格って訳じゃないみたいだ
0276デフォルトの名無しさん
2006/11/14(火) 08:50:220277デフォルトの名無しさん
2006/11/14(火) 08:56:43ベクターだっけ?
0278デフォルトの名無しさん
2006/11/14(火) 09:03:570279デフォルトの名無しさん
2006/11/14(火) 10:15:56ありがとう
0280デフォルトの名無しさん
2006/11/14(火) 11:25:400281デフォルトの名無しさん
2006/11/14(火) 11:27:32use constant LOG_DIR => './logs';
などの LOG_DIR や 関数呼び出しを書くことは可能ですか?
0282デフォルトの名無しさん
2006/11/14(火) 11:31:07foreach my $value (@log) {
if ($flag) {
undef $value;
}
}
ってやると @log から $valueの要素が削除されるのって仕様なの?
0283デフォルトの名無しさん
2006/11/14(火) 11:51:34削除されたんじゃなくて値がundefになっただけだと思うが、それは仕様。
If any element of LIST is an lvalue, you can modify it by modifying VAR
inside the loop. Conversely, if any element of LIST is NOT an lvalue,
any attempt to modify that element will fail. In other words, the
"foreach" loop index variable is an implicit alias for each item in the
list that you're looping over.
0284デフォルトの名無しさん
2006/11/14(火) 11:52:130285282
2006/11/14(火) 13:47:38ってやっても消えないよね
どうなってんの
0286デフォルトの名無しさん
2006/11/14(火) 13:53:54空文字列の代入
0287282
2006/11/14(火) 14:11:100288デフォルトの名無しさん
2006/11/14(火) 14:16:540289282
2006/11/14(火) 14:54:410290デフォルトの名無しさん
2006/11/14(火) 15:02:03こわいのは自分の無知だろ
0291デフォルトの名無しさん
2006/11/14(火) 15:02:17▓█ ▓█
▓▓██ ▓▓██
▓▓▓▓▓▓▓▓▓▓▓███
▓▓▓██▓▓▓▓▓██▓▓███
▓▓█▓▓▓▓▓▓▓▓▓█▓███
▓▓▓▓█▓▓▓▓▓█▓▓▓███
▓▓▓▓▓█████▓▓▓▓███
▓▓▓▓▓███▓▓▓▓███
▓▓▓▓▓▓▓▓▓███
▓▓▓▓▓▓▓▓▓▓▓▓███
▓▓▓▓▓▓▓▓▓▓▓▓▓▓███
▓▓▓▓▓▓▓▓▓▓▓▓▓▓███
これを見ると今年の大学受験に落ちます。
これを今から1時間以内に3回他スレにコピペすれば100%、受かります。
貼らないと
落 ち ま す
0292デフォルトの名無しさん
2006/11/14(火) 18:30:08できない。できたらかえって困る。here document なんだから。
ただ、$hoge のように「$」から始まっていれば変数置換は評価される。
しかし、$hoge がオブジェクトだったとしても
$hoge->method() としても method() は呼び出されない。
0293デフォルトの名無しさん
2006/11/14(火) 18:32:01>argvのv
釣りにマジレスで Volume。
0294デフォルトの名無しさん
2006/11/14(火) 18:52:32sub sum { $_[0] + $_[1] }
use constant THREE => 3;
print <<_EOF_;
${[sum(THREE,4)]}[0]
_EOF_
0295デフォルトの名無しさん
2006/11/14(火) 19:47:07独創的だな。
普通は @{[ expr ]} か ${\( expr )} だと思うが。
0296デフォルトの名無しさん
2006/11/14(火) 20:15:06を書くのが面倒なのですが、Cのプリプロセッサのようなことは
できないのでしょうか?
0297デフォルトの名無しさん
2006/11/14(火) 20:44:32cpanのshellでinstall Image::Magickと入力するとnmakeが実行されるのですが
windows.hが開けないと言われて終了してしまいます
vc++のインクルードディレクトリにはちゃんとwindows.hのあるディレクトリが指定してあり
vc++のプロジェクトでは普通にwindows.hをincludeすることができます
どうすればインストールできるのでしょうか
0298デフォルトの名無しさん
2006/11/14(火) 21:14:32分かったのですが、Error.pmのエレガントな使い方について
教えてもらえませんか?
0299デフォルトの名無しさん
2006/11/14(火) 21:38:14駄目な理由は、 lib/config_heavy.pl 参照。
自力でコンパイルする時は、perl自体もソースからコンパイルして生成するか
lib/config_heavy.pl と lib/config.pm を適切に修正する必要があるよ。
ActivePerlならppmを使う方法が楽。
自分は Image Magickのwin32パッケージに入ってる奴を入れた。
方法は Image MagickのREADME.TXTに書かれてる。
0300デフォルトの名無しさん
2006/11/14(火) 21:39:38プリプロセッサ相当のことならばFilterモジュールがそれだが…
"Thare's more than one way to do it."
sub __HERE__() {
my (undef, $filename, $line) = caller();
return "$filename:$line:";
}
print __HERE__;
0302デフォルトの名無しさん
2006/11/14(火) 22:59:58caller()で十分でした。ありがとうございます。
0303デフォルトの名無しさん
2006/11/15(水) 01:38:33flock(IN, 2);
@testdata = <IN>;
close(IN);
foreach (@testdata){
$_ =~ s/[\x0D\x0A\r\n]//g;
$_ .= "writed\x0A";
}
open(OUT, "> test.txt");
flock(OUT, 2);
print OUT @testdata;
close(OUT);
exit;
windows上で
こんな感じで「内容が複数行あるテキストファイル」を読み込んで少しだけ改変して
元のテキストファイルに上書きするスクリプトを書いていたのですが、
print OUT @testdata;でファイルへ保存するときに\x0Aが\x0D\x0Aに変換されてしまいます。
改行コードを指定して(この場合は変換せずに\x0Aのままで)保存したいのですが、
テキストファイル保存時の改行コードを指定するにはどうすればよいのでしょうか。
flock後にbinmodeを指定すれば期待通りの動作はしましたが、binmodeを指定せずにできる方法はありませんか。
0304デフォルトの名無しさん
2006/11/15(水) 02:08:150305デフォルトの名無しさん
2006/11/15(水) 03:51:03open OUT, '>:raw', 'test.txt' or die "$!\n";
flockも数字リテラルよりもFcntl.pmを使うのがお薦め。
0306デフォルトの名無しさん
2006/11/15(水) 05:05:31Windows+ActivePerl5.8の環境で、Windows標準の時計(時刻)をPerlで変更することってできますか?
0307デフォルトの名無しさん
2006/11/15(水) 07:29:580308デフォルトの名無しさん
2006/11/15(水) 08:39:58それは、Perlじゃなくて、その、なんていうの、そうゆうのは時計のほうを調べるんだよ。
0309デフォルトの名無しさん
2006/11/15(水) 10:15:47で &test(THREE);ってかくとエラーなんですけどなんでですか?
それと自作関数に&付ける人といない人がいますけど違いってあるの?
0310デフォルトの名無しさん
2006/11/15(水) 10:29:31エラーメッセージはインタプリタが人間に分かるように適切に出す大事な情報なんだよ。
おまえの説明はソースとエラーメッセージを省略してるからエスパーしか状況を把握できんぞ。
助けを求めるときには、おまえではなく他人に分かるように状況を説明しろ。
0311デフォルトの名無しさん
2006/11/15(水) 10:43:26http://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq7.html#what_s_the_difference_between_calling_a_function_as__foo_and_foo__
http://www.kt.rim.or.jp/~kbk/perl5.005/perlsub.html
0312デフォルトの名無しさん
2006/11/15(水) 11:33:26どこでどのようなエラーが出るのか、省略せずに全部書け。
サブルーチン呼出しで & を付ける必要があるのはそれがサブルーチン名だと
判別できない場合、つまり後ろの () がない状態で使う場合だ。
0313309
2006/11/15(水) 12:42:45サブルーチンのほうはわかりました。
>>209のソース間違えてました。
use constant (PL => 'test.pl');
require PL;
Can't locate PL.pm in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib .) at te
st.pl line 3.
とでます。PL.pm になってるんですが置き換えできないのでしょうか?
0314デフォルトの名無しさん
2006/11/15(水) 12:54:41サブルーチンの引数とrequireではかなり話が違う。
reqruire PL;
だとrequireに対してベアワードが引数だったときに'.pm'をつけてファイルを探す機能の
方が先に効いてしまうので
reqruire (PL);
などとすればよい。
0315309
2006/11/15(水) 13:01:370316デフォルトの名無しさん
2006/11/15(水) 19:12:32/ '' - ,,
/ '' - ,,
/ ヽ
i / /ヽ !
,i ./ / ''―、 !
i ,、 n て'' ノノ ヾ !
i ノノノ ノ ノ ''´ ! /
�U j ' ´ ノ ( ヽ |
>-,, / ,,=━━・!' ,ノ━== ! ノ
!・ ヽ | ’ニンniii、 :::::i/ィ7iii= i )
\(てi iヽ ^' ~ -' /}
`i_ 、 \ i_ l_j
`┐ i /(,,, ,n 〉 /\\ もうスクリプトっていうレベルじゃねぇぞ!
 ̄ ̄へ ! ' T'' l | \
| ! i ン=ェェi) i ソ )
| i´\! ,, -ェ`、_ン ノノ 〈
| | \\,, `―''´// |
| つ !、_''''''''''''' / 7
0317デフォルトの名無しさん
2006/11/15(水) 22:32:46サブルーチン呼出しよりも定義が先に perl に読まれる場合は () と & を省略可能。
サブルーチン呼出しよりも定義が後に perl に読まれる場合は () か & のいずれかが必要。
いずれの場合でも () または &、もしくはその両方を記述する事ができます。
いずれの場合でも & を付けるとプロトタイプ宣言を無視します。
0318デフォルトの名無しさん
2006/11/15(水) 22:36:570319デフォルトの名無しさん
2006/11/15(水) 22:59:57value1<TD>1<TD>value2<TD>24</TR>
<TD>ほげ<TD>73<TD>/\565
HOGE
;
$string =~ /value1<TD>(.*?)<TD>value2<TD>(.*?)<\/TR>(?:.|[^.])*?ほげ<TD>(.*?)<TD>/;
print(
"value1:$1\n".
"value2:$2\n".
"ほげ:$3\n"
);
これを実行すると
value1:
value2:
ほげ:
と何も表示されないのですが、$stringの中の\565のどれか一つ以上を消す、
パターンの中のほげの前に<TD>をつける、ほげを半角英数に置き換えるのいずれかをすると
value1:1
value2:24
ほげ:73
とうまくいきます。なぜですか?
0320デフォルトの名無しさん
2006/11/15(水) 23:06:24&をつけることによってプロトタイプを無視できる。
0321デフォルトの名無しさん
2006/11/15(水) 23:08:390322317
2006/11/15(水) 23:51:42最大のメリットは定義済か未定義かに加えて、言語組込の予約語との名前衝突を気にしなくてよくなる点ですが、>>317 では意図的に省いています。
でもこれはメリットかどうか微妙というかなんというか…、「やりたければそうすることもできるよ」という「Perl 流」(というよりも UNIX 流) の一例とは言えるでしょう。
常に付けておけば、マイナーな予約語との衝突によるややこしいエラーと格闘せずに済むという点ではメリットかもしれません。
0323デフォルトの名無しさん
2006/11/16(木) 00:00:06$string =~ m{value1<TD>(.*?)<TD>value2<TD>(.*?)</TR>[\r\n]*<TD>ほげ<TD>(.*?)<TD>};
素直に改行をマッチさせるんじゃダメなん?
>>322
予約語との衝突を防ぐのと、プロトタイプチェックされるのとでは、断然後者のほうが有益なような…
それに、衝突のチェックは、例えば構文色分けできるエディタで予約語を色分けすれば防げるよね。
まあ、個人の主観の問題なので、TMTOWTDIってことで……。
0325デフォルトの名無しさん
2006/11/16(木) 00:23:49なんだか面白い現象だね >>319 。
ぼくもよくわからんけど、さしあたり /\\\d\d\d?/ のような文字列が八進表現の文字コードによる文字指定として展開される点については知っていますか?
0326デフォルトの名無しさん
2006/11/16(木) 00:49:19あと、歴史的な理由もなかったかな。
perl4 とか 3の頃では、自作サブルーチンの呼び出しに&は必須だったような記憶が。
0327デフォルトの名無しさん
2006/11/16(木) 00:51:49>>325 の書いてる通り \565 は1つの文字として扱われてるんだけど、
Perl では文字列中に ASCII の範囲で表せない文字(255番以降の文字)が入ってると
UTF-8 の文字列として扱われる。(正確には UTF-8 をPerl独自に拡張した「utf8」)
この時、同じ文字列中にある「ほげ」も UTF-8 に変換されるけど、
その結果、正規表現中の(ファイルのエンコーディングでの)「ほげ」という文字の並びと
変換された「ほげ」が一致しなくなるので、マッチしなくなってしまう。
(しかも、\565 なんてわけがわからない文字と一緒だから、誤変換されてるっぽい)
これを防ぐには、スクリプトファイル自体を UTF-8 エンコーディングで保存して、
頭に use utf8; を付ければよい。文字列もパターンも全てUTF-8で統一されてハッピー。
0328デフォルトの名無しさん
2006/11/16(木) 01:45:12\565 がiso-8859-2(latin2 , 1文字=1バイト)で表現できない文字だから。
なので、$stringはutf8化されて格納される。
正規表現もiso-8859-2扱いだが、正規検索エンジンがutf8化を考慮しないので、
(utf8の仕様上)ASCII範囲外の文字がマッチしなくなる。
0329319
2006/11/16(木) 07:26:41なるほど。
そういうわけだったんですか。
では\565を消さずともほげの前に<TD>を追加するとマッチするのはなぜなんでしょうか?
<TD>に特別な意味はないのであるなしにかかわらず$stringはutf8として扱われ、結果マッチしないと思うのですが。
0330309
2006/11/16(木) 10:31:24use strict;
use constant (STR => 't', FLAG_X => 1);
if (FLAG_X && test()) {
print "OK";
}
sub test {
return 1;
}
Bareword "FLAG_X" not allowed while "strict subs" in use at t.pl line 4.
Execution of t.pl aborted due to compilation errors.
これはなぜなのでしょうか?
複数の定数を定義するとこうなるのですが
0331デフォルトの名無しさん
2006/11/16(木) 11:12:38$file{$num} = [(split)[2..4]];
この場合、splitは何を表しているのでしょうか?
0332デフォルトの名無しさん
2006/11/16(木) 11:38:23use constant {STR => 't', FLAG_X => 1};
0333デフォルトの名無しさん
2006/11/16(木) 11:39:47それ複数の定数の定義になってないし。perldoc constantよく読め。
× use constant (STR => 't', FLAG_X => 1);
○ use constant {STR => 't', FLAG_X => 1};
ちなみに上も便宜上×と書いたがそれはそれで正しい書き方で、
('t', 'FLAG_X', 1)というリストを値とする定数STRを定義したことになる。
0334デフォルトの名無しさん
2006/11/16(木) 11:42:26$_ = "aa bb cc dd ee";
$a = [(split)[2..4]];
print join(",", @{$a}) . "¥n";
-----
cc,dd,ee
0335デフォルトの名無しさん
2006/11/16(木) 11:44:03すべての引数を省略して組み込み関数splitを呼んでるだけ。
引数省略したときどういう意味になるかはマニュアル読め。
0336330
2006/11/16(木) 15:36:410337デフォルトの名無しさん
2006/11/16(木) 16:11:090338デフォルトの名無しさん
2006/11/16(木) 16:20:23言語はケースバイケースで使い分けられるのがよろし。
0339デフォルトの名無しさん
2006/11/16(木) 16:20:480340デフォルトの名無しさん
2006/11/16(木) 17:18:360341デフォルトの名無しさん
2006/11/16(木) 17:27:230342デフォルトの名無しさん
2006/11/16(木) 18:20:550343328
2006/11/16(木) 19:03:09ごめん、嘘書いてた。
iso-8859-2じゃなくてiso-8859-1だよ。
それと、「正規検索エンジンはユニコード/非ユニコード間のマッチが不完全」がより正確。
詳細は、perlソースのrecomp.cやreexec.c付近。
改めて、(328までを理解した前提で)319がマッチしない部分の詳細。
m/(?:.|[^.])*?ほげ/ は「複雑なパターン」の繰り返し+固定文字列として処理される。
この場合、繰り返しの終了判定に「固定文字列の先頭バイトと次の1バイトが一致」
という条件が追加される。
この追加の判定はユニコード/非ユニコード間の比較を考慮していないので、
「固定文字列の先頭バイトがutf8表現でも同じバイト表現」である場合を除き
正しい位置で「複雑なパターンの繰り返し」が終了しなくなる。
具体的にsjisでは「ほ」は 82 d9 で、\x{82}という文字のutf8表現は C2 82
本来繰り返しを終了すべき位置での判定は 82 と C2 になり、繰り返し部分の
処理が継続されてしまう。
eucやuse utf8してない場合のutf8でも似たようなもの。
319の正規表現だと、他の部分はユニコード/非ユニコード間を正しく処理できる。
だから、「(複雑なパターン)*?固定文字列」部分の*?直後に来る文字(固定文字列
の先頭文字)がutf8化しても同じバイト表現になる(=ASCII文字セットに含まれる)
事が、正しくマッチが行われる為の条件になっている。
0344デフォルトの名無しさん
2006/11/17(金) 11:06:23これはどのような動きをしているんでしょうか?
変数名は気にせずに。
0345デフォルトの名無しさん
2006/11/17(金) 11:18:40代入です
0346デフォルトの名無しさん
2006/11/17(金) 11:19:33とはいっても、mojiに代入できるのは1つでは?
0347デフォルトの名無しさん
2006/11/17(金) 11:20:07ハッシュdataのキー$mojiの値を、リスト($num1, $num2)へのリファレンスにしている。
0348デフォルトの名無しさん
2006/11/17(金) 11:22:17key value
moji → num1
moji → num2
ということでしょうか?
data{key}をプリントすれば
num1 と num2が表示されるということでしょうか?
0349デフォルトの名無しさん
2006/11/17(金) 11:27:51perl リファレンス でぐぐるといいかも
0350デフォルトの名無しさん
2006/11/17(金) 11:36:22my $num1 = 3;
my $num2 = 4;
my $moji =tetra;
$data{$moji} = [ $num1, $num2 ];
print("%d",$data{$moji});
perl 実行
%dARRAY(0x85a7c28
何かよくわからない結果になってしまったのですが・・・
0351デフォルトの名無しさん
2006/11/17(金) 11:43:050352デフォルトの名無しさん
2006/11/17(金) 11:43:21デバッグしろ
0353デフォルトの名無しさん
2006/11/17(金) 11:44:040354デフォルトの名無しさん
2006/11/17(金) 11:47:43「perl リファレンス でぐぐるといいかも」ともあるだろ
0355デフォルトの名無しさん
2006/11/17(金) 11:48:430356デフォルトの名無しさん
2006/11/17(金) 11:54:33わからないなら知ったかしないでください
0357デフォルトの名無しさん
2006/11/17(金) 12:05:05どこが間違っているか調べて、それを修正して正しくする。
0358デフォルトの名無しさん
2006/11/17(金) 12:35:21ひと通り見た上でわからない点があれば質問するといいよ
0359デフォルトの名無しさん
2006/11/17(金) 12:41:390360デフォルトの名無しさん
2006/11/17(金) 12:46:18何が?
0361デフォルトの名無しさん
2006/11/17(金) 12:48:17マルチ?
0362デフォルトの名無しさん
2006/11/17(金) 12:50:38ぐぐって1ページ目の全サイトを1日かけて読め
■ このスレッドは過去ログ倉庫に格納されています