トップページ⇒tech
1001コメント344KB

Perlについての質問箱 28箱目

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/10/31(火) 14:52:21
"The duct tape of the Internet" こと、Perlについての質問箱です。
"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
while (<DATA>) {
$file{$num} = [(split)[2..4]];


この場合、splitは何を表しているのでしょうか?
0332デフォルトの名無しさん2006/11/16(木) 11:38:23
>>330

use constant {STR => 't', FLAG_X => 1};
0333デフォルトの名無しさん2006/11/16(木) 11:39:47
>>330
それ複数の定数の定義になってないし。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
>>331
$_ = "aa bb cc dd ee";
$a = [(split)[2..4]];
print join(",", @{$a}) . "¥n";
-----
cc,dd,ee
0335デフォルトの名無しさん2006/11/16(木) 11:44:03
>>331
すべての引数を省略して組み込み関数splitを呼んでるだけ。
引数省略したときどういう意味になるかはマニュアル読め。
03363302006/11/16(木) 15:36:41
ありがとうこざいました。
0337デフォルトの名無しさん2006/11/16(木) 16:11:09
Perlのオブジェクト指向使いづらっ
0338デフォルトの名無しさん2006/11/16(木) 16:20:23
OOPは後から取って付けたものだからねえ。
言語はケースバイケースで使い分けられるのがよろし。
0339デフォルトの名無しさん2006/11/16(木) 16:20:48
どの辺が使いにくいと思ったかも書けよ。
0340デフォルトの名無しさん2006/11/16(木) 17:18:36
そんな自明のことは書かなくていい
0341デフォルトの名無しさん2006/11/16(木) 17:27:23
そこまでいうとOOP使いづらいのも自明じゃないか...
0342デフォルトの名無しさん2006/11/16(木) 18:20:55
ぶっちゃけ慣れの問題だろ
03433282006/11/16(木) 19:03:09
>>329
ごめん、嘘書いてた。
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
$data{$moji} = [ $num1, $num2 ];

これはどのような動きをしているんでしょうか?
変数名は気にせずに。
0345デフォルトの名無しさん2006/11/17(金) 11:18:40
>>344
代入です
0346デフォルトの名無しさん2006/11/17(金) 11:19:33
>>345
とはいっても、mojiに代入できるのは1つでは?
0347デフォルトの名無しさん2006/11/17(金) 11:20:07
>>344
ハッシュdataのキー$mojiの値を、リスト($num1, $num2)へのリファレンスにしている。
0348デフォルトの名無しさん2006/11/17(金) 11:22:17
>>347

key value
moji → num1
moji → num2

ということでしょうか?
data{key}をプリントすれば
num1 と num2が表示されるということでしょうか?
0349デフォルトの名無しさん2006/11/17(金) 11:27:51
プリントしてみなよ
perl リファレンス でぐぐるといいかも
0350デフォルトの名無しさん2006/11/17(金) 11:36:22
my (%data);
my $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:05
それがリファレンスです
0352デフォルトの名無しさん2006/11/17(金) 11:43:21
>>350
デバッグしろ
0353デフォルトの名無しさん2006/11/17(金) 11:44:04
デバッグってどうするんですか?
0354デフォルトの名無しさん2006/11/17(金) 11:47:43
「リファレンス」って言葉が何回も出てるし
「perl リファレンス でぐぐるといいかも」ともあるだろ
0355デフォルトの名無しさん2006/11/17(金) 11:48:43
少なくとも結果はでてます
0356デフォルトの名無しさん2006/11/17(金) 11:54:33
なんすかー
わからないなら知ったかしないでください
0357デフォルトの名無しさん2006/11/17(金) 12:05:05
>>353
どこが間違っているか調べて、それを修正して正しくする。
0358デフォルトの名無しさん2006/11/17(金) 12:35:21
ここで説明するより、解説してるサイトや本を見てもらったほうが早い
ひと通り見た上でわからない点があれば質問するといいよ
0359デフォルトの名無しさん2006/11/17(金) 12:41:39
のってない
0360デフォルトの名無しさん2006/11/17(金) 12:46:18
>>359
何が?
0361デフォルトの名無しさん2006/11/17(金) 12:48:17
http://pc8.2ch.net/test/read.cgi/tech/1163409543/16
マルチ?
0362デフォルトの名無しさん2006/11/17(金) 12:50:38
perl リファレンス 無名配列
ぐぐって1ページ目の全サイトを1日かけて読め
0363デフォルトの名無しさん2006/11/17(金) 12:55:48
1日もかけたらこのスレの意味がない
0364デフォルトの名無しさん2006/11/17(金) 13:06:27
print $data{$moji}->[0];
print $data{$moji}->[1];

これでわかっただろ。
0365デフォルトの名無しさん2006/11/17(金) 13:07:52
以下放置で。
0366デフォルトの名無しさん2006/11/17(金) 13:37:28
>>364
できねぇぞ
嘘つくなよ
0367デフォルトの名無しさん2006/11/17(金) 13:49:20
age
0368デフォルトの名無しさん2006/11/17(金) 14:54:02
ここは学校でもなんでもないのです。
一から手取り足取り教えてくれるわけないのです。
それくらい初歩的で、調べればいくらでも答えの出てくる質問なのです。
自分に調べる能力がないからって駄々こねて暴れても無駄です。
0369デフォルトの名無しさん2006/11/17(金) 15:25:55
このままできない様なら
Perl6バージョンアップボタンを押からな
0370デフォルトの名無しさん2006/11/17(金) 18:40:32
for (sort {$file{$a}[1] <=> $file{$b}[1]} @keys) {
for $box (@{$data{$_}}) {
}

すみません、これはどういうことを表しているのでしょうか?
0371デフォルトの名無しさん2006/11/17(金) 19:44:33
>>370
リスト@keysの要素をハッシュ%fileのキーにしたときの値のリストの2個目(1番目)の要素によってリスト@keysを昇順にソートし、
ソートされた各値をハッシュ%dataのキーにしたときの値の文字列を名前とするリストの各要素を変数$boxに入れて繰り返すことを
ソートされた@keysの要素でくりかえす

ってことかな。
0372デフォルトの名無しさん2006/11/17(金) 20:20:35
keys = ai bi ci di ei
とすると

file[ai][1] <=> [][2]

ん、これは aiとbiを比較してから 昇順にソートして
for $boxの行を実行するのか

それともai からeiを全てが 昇順になるようにその行でソートしてから
for $boxの行を実行するのでしょうか?
0373デフォルトの名無しさん2006/11/17(金) 22:13:58
>>372
日本語でおp
0374デフォルトの名無しさん2006/11/17(金) 22:19:27
>>371
この場合の比較って
どういう順に比較するのでしょうか?

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
>>374
マニュアル見れ
03761592006/11/18(土) 02:16:29
rand関数を使っているのですが。
$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
376の名前である159の意味はないです。
申し訳ありません
0378デフォルトの名無しさん2006/11/18(土) 04:25:11
>>376
つ 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:23
randが返した値サンプル10個

0.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:03
\8000などから\を削除したいのですが逆chonp関数みたいなものってありますか?
0381デフォルトの名無しさん2006/11/18(土) 10:43:44
>>380
無いが、substrでポレポレしれ。
0382デフォルトの名無しさん2006/11/18(土) 10:53:07
s/^.// とか
0383デフォルトの名無しさん2006/11/18(土) 10:58:04
>>381-382
ありがとうございます。
解決しました。

# substrってs///で代用出来る思うんですが、何かメリットあるんでしょうか?
0384デフォルトの名無しさん2006/11/18(土) 11:34:36
# chompってs///で代用出来る思うんですが、何かメリットあるんでしょうか?
0385デフォルトの名無しさん2006/11/18(土) 11:58:32
# なるほど
0386デフォルトの名無しさん2006/11/18(土) 13:21:50
#println関数みたいなのって無いの?
0387デフォルトの名無しさん2006/11/18(土) 15:33:45
自分で作ればいいじゃない
0388デフォルトの名無しさん2006/11/18(土) 16:13:27
>>386
つPerl6::Say
0389デフォルトの名無しさん2006/11/18(土) 17:44:52
>>387
> 自分で作ればいいじゃない

ワンライナーなときに欲しいよね。
0390デフォルトの名無しさん2006/11/18(土) 17:58:01
>>389
perl -le 'print "hage"'
0391デフォルトの名無しさん2006/11/18(土) 17:59:40
このスレは本当に勉強になります。
ところで、OOP勉強として、モジュールの中身を覗いているのですが、
意外と複雑な物が多いです。初心者が読めるくらいの単純なモジュールのお勧めはないですか?
(レファレンス、パッケージ、オブジェクトの概念はわかります)
「ああ、こういう風に実装してるのか」という実感がつかみたいのです。
perlの勉強で、一番始めにソースを読んでみたモジュールを教えてくださっても構いません。
0392デフォルトの名無しさん2006/11/18(土) 18:32:04
Class::Data::Inheritableマジお勧め。
短いのにいろいろ勉強になるテクニック満載
0393デフォルトの名無しさん2006/11/18(土) 22:43:34
Catalyst 嫁
0394デフォルトの名無しさん2006/11/18(土) 23:07:15
Plagger詠め
0395デフォルトの名無しさん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
欲しい関数を仮に jsplit() とすると、こんなイメージです。

$tmp = "我輩はネコである";
@words = jsplit($tmp);
foreach $word (@words) {
print $word,"\n";
}

出力結果:

我輩
は
ネコ
で
ある。
0398デフォルトの名無しさん2006/11/19(日) 00:54:05
>395
日本語で書いてくれ。

>396
日本語の分かち書きだな。Text::ChasenかText::MeCabあたりかな。
0399デフォルトの名無しさん2006/11/19(日) 01:01:15
>>395
${"$abc" . "$i"}
0400デフォルトの名無しさん2006/11/19(日) 01:01:22
>>395
惜しい。
${$abc . $i}
04013962006/11/19(日) 01:49:21
Text::Chasen
http://chasen.aist-nara.ac.jp/chasen/distribution.html.ja
こちらは辞書込みでDLしてインストールですね。

Text::MeCab
http://mecab.sourceforge.jp/
こちらは CPAN のモジュールなんで、PPMで落せるかもとwktk。

その他、Kakasi とかいうモジュールもあるそうですが、
簡単そうなMeCab で頑張ってみます。

ありがとうございました。 >>398 さん
04023952006/11/19(日) 02:55:59
>>399
>>400
ありがとうございます。
無事にできました。
use strict;
を使ってたらエラーが出ましたが、はずしたらうまく動きました。
0403デフォルトの名無しさん2006/11/19(日) 04:53:05
>>402
何に使うか知らんが、配列にしたらええやん。
04043912006/11/19(日) 10:45:48
>>392-394
おお、ありがとうございます!! 張り切って読んでみます。
0405デフォルトの名無しさん2006/11/19(日) 11:21:31
正規表現で日本語(S-JIS)を使うと [ が入ってるとエラーが出るのですが
皆さんどうやって回避してますか?(たとえば「ー」があると言われる)

文字コードを変換してるのでしょうか?
0406デフォルトの名無しさん2006/11/19(日) 11:29:16
普通はutf8かeucに変換してから扱うと思うんだ
0407デフォルトの名無しさん2006/11/19(日) 11:31:45
入出力時に変換してスクリプトと内部処理はutf8に統一
0408デフォルトの名無しさん2006/11/19(日) 11:32:36
\Q\E とか use encoding とか
0409デフォルトの名無しさん2006/11/19(日) 12:32:03
皆さんどうやって変換してますか?
Jcode->convert()
Jcode->new()->euc で変換するのはおk?

0410デフォルトの名無しさん2006/11/19(日) 12:42:19
板違いだが、ケータイの絵文字なんかが入力される環境だと文字コード変換しにくいんだよな……。
0411デフォルトの名無しさん2006/11/19(日) 13:17:55
>>410
そのあたりを扱うフレームワークが作られていたと思ったが。
0412デフォルトの名無しさんNGNG?BRZ(5115)
Encode::JP::Mobile
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
Perl には詳しくない。独学。

いまだに sprintf() を使ってしまう。
printf( "%d\n" $hogehoge); と書く癖が抜けない。
0417デフォルトの名無しさん2006/11/19(日) 15:49:07
ソースコードを読もう。
0418デフォルトの名無しさん2006/11/19(日) 15:51:03
計算機言語の講義なんてナンセンス。
自分で習得しやがらない阿呆ための救済策だ。
0419デフォルトの名無しさん2006/11/19(日) 17:09:07
言語の習得は目的ではない。手段だ。
0420デフォルトの名無しさん2006/11/19(日) 17:09:20
情報系の学科を修了した人は、高卒に見えてしまう。
0421デフォルトの名無しさん2006/11/19(日) 17:23:19
どのルート辿ろうが
勉強し続けなきゃろくなことできないからな
0422デフォルトの名無しさん2006/11/19(日) 17:27:51
>>414
情報系の大学では、言語の講義なんておまけだよ。
もう書いている人がいるように、尻拭い的。
0423デフォルトの名無しさん2006/11/19(日) 17:49:04
for (sort {$file{$a}[1] <=> $file{$b}[1]} @keys) {
for $box (@{$data{$_}}) {
}

これって、{$a},{$b} には最初に何が入るのでしょうか?
@kes の要素の1番めと1番めですか?
その次が2番めと2番めですか?
0424デフォルトの名無しさん2006/11/19(日) 18:12:28
>>423
訊いてるヒマがあったら調べろよ。
0425デフォルトの名無しさん2006/11/19(日) 18:36:07
以下のような感じで$FOOというグローバル変数を
宣言しているつもりなのですが、エラーになってしまいます。
何がいけないのでしょうか?

[エラー内容]
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
>>424
そっくりそのまま返す
0427デフォルトの名無しさん2006/11/19(日) 18:49:02
>>425
myはグローバル変数ではなくレキシカル変数の宣言だよ。
グローバル変数の宣言はourを使え。
詳細は
perldoc -f my
perldoc -f our
0428デフォルトの名無しさん2006/11/19(日) 18:51:59
>>425
どう見ても$FOOをファイルconfig.pl内にローカル化しています。
0429デフォルトの名無しさん2006/11/19(日) 18:58:10
for data (@datas){
これってどういう意味なのでしょうか?
for文ではありえない気がするのですが
0430デフォルトの名無しさん2006/11/19(日) 19:26:36
ありえないだろうな
普通 for $data (@datas) {} だし、
それ以前にdataの複数形ってなんだ


@datasの要素を1つずつ$dataに代入し、ブロックを実行します
foreach $data (@datas) {} と等価です
■ このスレッドは過去ログ倉庫に格納されています