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
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日かけて読め
0363デフォルトの名無しさん
2006/11/17(金) 12:55:480364デフォルトの名無しさん
2006/11/17(金) 13:06:27print $data{$moji}->[1];
これでわかっただろ。
0365デフォルトの名無しさん
2006/11/17(金) 13:07:520366デフォルトの名無しさん
2006/11/17(金) 13:37:28できねぇぞ
嘘つくなよ
0367デフォルトの名無しさん
2006/11/17(金) 13:49:200368デフォルトの名無しさん
2006/11/17(金) 14:54:02一から手取り足取り教えてくれるわけないのです。
それくらい初歩的で、調べればいくらでも答えの出てくる質問なのです。
自分に調べる能力がないからって駄々こねて暴れても無駄です。
0369デフォルトの名無しさん
2006/11/17(金) 15:25:55Perl6バージョンアップボタンを押からな
0370デフォルトの名無しさん
2006/11/17(金) 18:40:32for $box (@{$data{$_}}) {
}
すみません、これはどういうことを表しているのでしょうか?
0371デフォルトの名無しさん
2006/11/17(金) 19:44:33リスト@keysの要素をハッシュ%fileのキーにしたときの値のリストの2個目(1番目)の要素によってリスト@keysを昇順にソートし、
ソートされた各値をハッシュ%dataのキーにしたときの値の文字列を名前とするリストの各要素を変数$boxに入れて繰り返すことを
ソートされた@keysの要素でくりかえす
ってことかな。
0372デフォルトの名無しさん
2006/11/17(金) 20:20:35とすると
file[ai][1] <=> [][2]
ん、これは aiとbiを比較してから 昇順にソートして
for $boxの行を実行するのか
それともai からeiを全てが 昇順になるようにその行でソートしてから
for $boxの行を実行するのでしょうか?
0373デフォルトの名無しさん
2006/11/17(金) 22:13:58日本語でおp
0374デフォルトの名無しさん
2006/11/17(金) 22:19:27この場合の比較って
どういう順に比較するのでしょうか?
123456789 があるとしたら
1-2 1-3 1-4 1-5 1-6 1-7 1-8 1-9
2-3 2-4 2-5 2-6 ...
..
8-9 とまで全て比較しているのでしょうか?
0375デフォルトの名無しさん
2006/11/17(金) 22:37:25マニュアル見れ
0376159
2006/11/18(土) 02:16:29$r=int(rand(65536)+1);
で使用した場合
$rでは奇数しか値を取りません。
もしかしてrand関数は32768までしかランダムで撮りませんか?
仮に$r=int(rand(32769)+1);
にすると32769のみ値をとりませんでした。
これを解消して65536までのランダム関数にしたい場合は
$r=int(rand(32768)+1)+int(rand(32768)+1);
にするしかないんでしょうか?もっとうまい具合の方法があったら教えてください
0377デフォルトの名無しさん
2006/11/18(土) 02:17:36申し訳ありません
0378デフォルトの名無しさん
2006/11/18(土) 04:25:11つ perldoc -f rand
RANDBIT値の確認は、use Config "config_vars"; で print config_vars('randbits'); 付近。
この値が15なら 2^15通り,48なら2^48通りの値を(rand関数は)返す。
対策ならば、それよりは
int((unpack('L',pack('CCCC',rand(256),rand(256),rand(256),rand(256)))/4294967296*65536)+1);
や
int(rand(256))*256+int(rand(256))+1;
の方が多少マシだと思う。
質の良い乱数が必要ならば専用のモジュールをあたるべき。
0379デフォルトの名無しさん
2006/11/18(土) 04:40:230.56646728515625
0.523223876953125
0.143218994140625
0.589141845703125
0.5029296875
0.998626708984375
0.325347900390625
0.82904052734375
0.5904541015625
0.816375732421875
これらに65536を掛けると全て偶数でかつ整数
どゆううこと?
0380デフォルトの名無しさん
2006/11/18(土) 10:33:030381デフォルトの名無しさん
2006/11/18(土) 10:43:44無いが、substrでポレポレしれ。
0382デフォルトの名無しさん
2006/11/18(土) 10:53:070383デフォルトの名無しさん
2006/11/18(土) 10:58:04ありがとうございます。
解決しました。
# substrってs///で代用出来る思うんですが、何かメリットあるんでしょうか?
0384デフォルトの名無しさん
2006/11/18(土) 11:34:360385デフォルトの名無しさん
2006/11/18(土) 11:58:320386デフォルトの名無しさん
2006/11/18(土) 13:21:500387デフォルトの名無しさん
2006/11/18(土) 15:33:450388デフォルトの名無しさん
2006/11/18(土) 16:13:27つPerl6::Say
0389デフォルトの名無しさん
2006/11/18(土) 17:44:52> 自分で作ればいいじゃない
ワンライナーなときに欲しいよね。
0390デフォルトの名無しさん
2006/11/18(土) 17:58:01perl -le 'print "hage"'
0391デフォルトの名無しさん
2006/11/18(土) 17:59:40ところで、OOP勉強として、モジュールの中身を覗いているのですが、
意外と複雑な物が多いです。初心者が読めるくらいの単純なモジュールのお勧めはないですか?
(レファレンス、パッケージ、オブジェクトの概念はわかります)
「ああ、こういう風に実装してるのか」という実感がつかみたいのです。
perlの勉強で、一番始めにソースを読んでみたモジュールを教えてくださっても構いません。
0392デフォルトの名無しさん
2006/11/18(土) 18:32:04短いのにいろいろ勉強になるテクニック満載
0393デフォルトの名無しさん
2006/11/18(土) 22:43:340394デフォルトの名無しさん
2006/11/18(土) 23:07:150395デフォルトの名無しさん
2006/11/19(日) 00:23:13お助けください。
変数名に変数を使いたいたく、いろいろ試してみたのですがどうもうまくいきません。
$abc="file"として、$iを0,1,2,3,4・・・と増やしたいのです。
$abc$i
${abc"$i"}
${"abc" . "$i"}
など試してみましたが、だめでした。
なにかよい方法ないでしょうか?
0396デフォルトの名無しさん
2006/11/19(日) 00:26:31日本語の文章を入力すると、
ばらされた単語になって出力されるなんていう
便利なモジュールはありませんか?
split の日本語バージョンに相当するものが欲しいのです。
$tmp = "I am a cat.";
@words = split( " ", $tmp);
foreach $word (@words) {
print $word,"\n";
}
とすると、以下の出力が得られます。
I
am
a
cat.
0397デフォルトの名無しさん
2006/11/19(日) 00:27:13$tmp = "我輩はネコである";
@words = jsplit($tmp);
foreach $word (@words) {
print $word,"\n";
}
出力結果:
我輩
は
ネコ
で
ある。
0398デフォルトの名無しさん
2006/11/19(日) 00:54:05日本語で書いてくれ。
>396
日本語の分かち書きだな。Text::ChasenかText::MeCabあたりかな。
0399デフォルトの名無しさん
2006/11/19(日) 01:01:15${"$abc" . "$i"}
0400デフォルトの名無しさん
2006/11/19(日) 01:01:22惜しい。
${$abc . $i}
0401396
2006/11/19(日) 01:49:21http://chasen.aist-nara.ac.jp/chasen/distribution.html.ja
こちらは辞書込みでDLしてインストールですね。
Text::MeCab
http://mecab.sourceforge.jp/
こちらは CPAN のモジュールなんで、PPMで落せるかもとwktk。
その他、Kakasi とかいうモジュールもあるそうですが、
簡単そうなMeCab で頑張ってみます。
ありがとうございました。 >>398 さん
0402395
2006/11/19(日) 02:55:59>>400
ありがとうございます。
無事にできました。
use strict;
を使ってたらエラーが出ましたが、はずしたらうまく動きました。
0403デフォルトの名無しさん
2006/11/19(日) 04:53:05何に使うか知らんが、配列にしたらええやん。
0405デフォルトの名無しさん
2006/11/19(日) 11:21:31皆さんどうやって回避してますか?(たとえば「ー」があると言われる)
文字コードを変換してるのでしょうか?
0406デフォルトの名無しさん
2006/11/19(日) 11:29:160407デフォルトの名無しさん
2006/11/19(日) 11:31:450408デフォルトの名無しさん
2006/11/19(日) 11:32:360409デフォルトの名無しさん
2006/11/19(日) 12:32:03Jcode->convert()
Jcode->new()->euc で変換するのはおk?
0410デフォルトの名無しさん
2006/11/19(日) 12:42:190411デフォルトの名無しさん
2006/11/19(日) 13:17:55そのあたりを扱うフレームワークが作られていたと思ったが。
0413デフォルトの名無しさん
2006/11/19(日) 14:15:52今度、仕事先に導入してみない?って聞いてくる。
0414デフォルトの名無しさん
2006/11/19(日) 14:25:00大学などでは、Javaなどの言語の講義はあると思いますが、
Perlは高等教育、情報科学教育では嫌われている言語ので、
授業などで学ぶ機会は少ないと思います。
perlに詳しい方は、どのような勉強法をされましたか?
皆さん独学ですか?
0415デフォルトの名無しさん
2006/11/19(日) 15:25:31ことプログラミングに関しては、他人に習うということは忘れた方が良い。
0416デフォルトの名無しさん
2006/11/19(日) 15:29:28いまだに sprintf() を使ってしまう。
printf( "%d\n" $hogehoge); と書く癖が抜けない。
0417デフォルトの名無しさん
2006/11/19(日) 15:49:070418デフォルトの名無しさん
2006/11/19(日) 15:51:03自分で習得しやがらない阿呆ための救済策だ。
0419デフォルトの名無しさん
2006/11/19(日) 17:09:070420デフォルトの名無しさん
2006/11/19(日) 17:09:200421デフォルトの名無しさん
2006/11/19(日) 17:23:19勉強し続けなきゃろくなことできないからな
0422デフォルトの名無しさん
2006/11/19(日) 17:27:51情報系の大学では、言語の講義なんておまけだよ。
もう書いている人がいるように、尻拭い的。
0423デフォルトの名無しさん
2006/11/19(日) 17:49:04for $box (@{$data{$_}}) {
}
これって、{$a},{$b} には最初に何が入るのでしょうか?
@kes の要素の1番めと1番めですか?
その次が2番めと2番めですか?
0424デフォルトの名無しさん
2006/11/19(日) 18:12:28訊いてるヒマがあったら調べろよ。
0425デフォルトの名無しさん
2006/11/19(日) 18:36:07宣言しているつもりなのですが、エラーになってしまいます。
何がいけないのでしょうか?
[エラー内容]
Global symbol "$FOO" requires explicit package name at test.pl line 11.
Execution of test.pl aborted due to compilation errors.
[test.pl]
#!/usr/bin/perl
use strict;
use warnings;
require "config.pl";
&main();
sub main {
print($FOO);
}
[config.pl]
my $FOO = "aaaaa";
1;
0426デフォルトの名無しさん
2006/11/19(日) 18:44:15そっくりそのまま返す
0427デフォルトの名無しさん
2006/11/19(日) 18:49:02myはグローバル変数ではなくレキシカル変数の宣言だよ。
グローバル変数の宣言はourを使え。
詳細は
perldoc -f my
perldoc -f our
0428デフォルトの名無しさん
2006/11/19(日) 18:51:59どう見ても$FOOをファイルconfig.pl内にローカル化しています。
0429デフォルトの名無しさん
2006/11/19(日) 18:58:10これってどういう意味なのでしょうか?
for文ではありえない気がするのですが
0430デフォルトの名無しさん
2006/11/19(日) 19:26:36普通 for $data (@datas) {} だし、
それ以前にdataの複数形ってなんだ
@datasの要素を1つずつ$dataに代入し、ブロックを実行します
foreach $data (@datas) {} と等価です
■ このスレッドは過去ログ倉庫に格納されています