トップページ⇒tech
994コメント314KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん05/01/17 18:11:32
"The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。

CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板 http://pc5.2ch.net/php/ )

CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。

http://www.perl.org/get.html
● 2005/01/17現在の最新版: 5.8.6
● 2005/01/17現在の開発版: 5.9.1
0159デフォルトの名無しさん05/01/28 21:47:33
>>150
~/.cpan/CPAN/MyConfig.pm
が設定ファイルだから再インストなんかしないでこいつを編集。
rootで入れたんなら、
/usr/local/lib/perl5/5.8.4/CPAN/Config.pm
が設定ファイルなので好きなようにパラメータを編集すればよし。
0160デフォルトの名無しさん05/01/28 22:15:06
俺が思うにperlでpdf自体が王道じゃない。
だって、初めて聞いたし。

でも興味あるから見てみる。
0161デフォルトの名無しさん05/01/28 22:48:29
>>158
PDFJのほうが好き。


0162デフォルトの名無しさん05/01/28 23:20:55
PDFJ なんて物があったんですね。これは良さそうですね
articledemo.pdf のようにサンプル論文PDF程度のことが
ことができれば自分的には十分なので
0163デフォルトの名無しさん05/01/29 01:23:22
なるほど〜
0164デフォルトの名無しさん05/01/29 05:13:13
失礼します。perlのプログラミングをやってみたいのですが
手始めに何か参考本がほしくなりました。お勧めの本とかってありませんでしょうか?
あんまり入門本とかではなくて分厚くて読み応えのある本がいいのですが・・・。
よろしくお願いします。
0165デフォルトの名無しさん05/01/29 05:31:44
>>164
>>2
一応こういうスレもある
【Perl,CGI】参考書籍 第三版
http://pc5.2ch.net/test/read.cgi/php/1030209573/
016616505/01/29 05:34:38
間違えた
×>>2
○>>3ね
0167デフォルトの名無しさん05/01/29 09:13:48
>>164
perlがはじめてで読み応えある本希望ということなら、>>3の
駱駝で決まりだろうな。
016816405/01/29 15:16:59
あぁ。助かります。どうもありがとうございます。
アマゾンで予約してきます。
0169デフォルトの名無しさん05/01/29 22:28:40
パソコン初心者板総合質問スレッドvol.931から誘導されてきた者なんですが。
age2ch.plのsearch.plを
my @crypted = ($content =~ /<dd>([0-9a-zA-Z\/\.]{11})<br><br>/g);
↓
my @crypted = ($content =~ /<dd>\s*([0-9a-zA-Z\/\.]{11})\s*<br><br>/g);
に書きなおすということは、どういうことで、どのような変化が起こるのですか?
教えて下さい。お願いします。
0170デフォルトの名無しさん05/01/29 22:29:49
Usr | S 11/17 00:46:33 1100619993.349208 | E 11/17 00:46:33 1100619993.361487 | ID:21124 | 0.012279
Cnt | S 11/17 00:07:07 1100617627.980650 | E 11/17 00:07:39 1100617659.310731 | ID:32539 | 31.330081
Day | S 11/17 00:04:59 1100617499.362986 | E 11/17 00:04:59 1100617499.628110 | ID:21124 | 0.265124

というような形式で記述されているテキストを、『| E』の直前の17バイトの数字で
ソートしてファイルに書き込みたいのですが、どのようなコードかわからず躓いてます。



while( <READ> )
{
 if ( /(\w{3}) | S (\d+)\/(\d+) (\d+):(\d+):(\d+) (\S{17}) | E (\d+)\/(\d+) (\d+):(\d+):(\d+) (\S{17}) | ID:(\d+) | (\S+)$/ )
  {
   push ( @value , [ $2, $_ ] );
  }
}

@sort_value = sort{ $a->[0]<=>$b->[0] } @value;
print WRITE $_->[1] foreach( @sort_value );

としてあるのですが、意図した通りに動いてくれません。
どのようにしたらいいでしょうか?

どなたかわかる方、ご教授お願いいたします。
0171デフォルトの名無しさん05/01/29 22:31:52
push ( @value , [ $2, $_ ] );

は、

push ( @value , [ $7, $_ ] );

の書き間違えです。
$7 の方でやっているのにできません。
0172デフォルトの名無しさん05/01/29 22:43:43
>>170
俺なら、「『| E』の直前の17バイトの数字」をkeyとするhashに行をぶち込み、
(まあ、たとえば%hogeとすると)
foreach (sort keys %hash){
print WRITE $hash{$_};
}
とするな
0173デフォルトの名無しさん05/01/29 22:44:24
つか、無理に正規表現で表そうとしないで
単純にsplitすればいいんじゃない?
0174デフォルトの名無しさん05/01/29 22:51:33
>>173
そうね、「『| E』の直前の17バイトの数字」の抽出は正規表現でもいいし、
行に規則性があればsplitのほうが簡単
0175デフォルトの名無しさん05/01/29 23:29:54
>>170
> としてあるのですが、意図した通りに動いてくれません。
> どのようにしたらいいでしょうか?

どこでおかしくなっているのか調べて、そこを修正するといいよ。
0176デフォルトの名無しさん05/01/29 23:31:55
>>170
「|」は正規表現のメタキャラクタだからエスケープしろ。
他にも突っ込みどころはあるが致命的な間違いはたぶん
これ。
0177デフォルトの名無しさん05/01/30 00:16:53
my @value = <READ>;
my $RegExp = qr/(\S{17}) (?: \| E)/;
close READ;
print WRITE map $_->[1], sort $a->[0] <=> $b->[0], map [ (/$RegExp/o)[0], $_ ], @value;
close WRITE;

かな?
0178デフォルトの名無しさん05/01/30 00:25:05
>>177
余計なものが色々入ってないか?
0179デフォルトの名無しさん05/01/30 01:55:10
>>169
my @crypted = ($content =~ /<dd>([0-9a-zA-Z\/\.]{11})<br><br>/g);
というのは、$content(投稿内容)に含まれるIPアドレスを暗号化して、
age2ch.plを誰が使っているのか解らなくする命令だ。そこに「\s*」を
挿入すると、暗号化が解除されて、キミのIPアドレスが2ちゃんねるの
運営側に筒抜けになる。
意味が解らない人に罠をかけて陥れようとする香具師がいるようだな。
018016905/01/30 02:28:02
>>179
ホントですか!?なんか人間不信になりそうですが・・
ではこれは、やらないほうがいいということですね。
そうするとsearch.plは、もう使い物にならないということですか?
他になにか探す方法はないのでしょうか?
教えて下さい。お願いします。
0181デフォルトの名無しさん05/01/30 03:43:10
>>179
面白いけどちょっと遊びすぎw

>>180
嘘ですよ
それは、
<dd>※(本体)※<br><br>
※のところに空白が入っていても、マッチングに成功するようにする修正パッチ。
0182デフォルトの名無しさん05/01/30 06:47:45
>>180
> ホントですか!?なんか人間不信になりそうですが・・
↑そっくり、お返ししたい今日この頃…。
0183デフォルトの名無しさん05/01/30 16:23:01
joinを使って連結させようとしているんですが。
半角スペースを区切り文字に指定するとき
join(" ",@array)
で出来ないのですが、半角スペースはどう書けばいいんでしょうか?
0184デフォルトの名無しさん05/01/30 16:30:09
>>183
どう出来無いの?
それで当ってそうだけど

#ってか本人ならCスレに誤爆詫び入れとけよ
0185デフォルトの名無しさん05/01/30 16:31:00
わかりました
018618305/01/30 16:33:56
DBファイルとして保存しようとしたんですが。
" "で、連結したのに、" "がないんです。
018718305/01/30 16:35:39
ども、できました
失礼しました。
0188デフォルトの名無しさん05/01/30 17:00:32
余談だけど、展開する必要のない文字列は '' で、囲うクセを付けると良いよ。
0189デフォルトの名無しさん05/01/30 17:06:58
>>188
同意だけど二つ並べちゃうとダブルクォーテーション一つに見えるよ・・・
0190デフォルトの名無しさん05/01/30 17:42:05
'hoge'.$hage
"hoge$hage"
どっちがいいの?
0191デフォルトの名無しさん05/01/30 17:46:48
>>189
> 同意だけど二つ並べちゃうとダブルクォーテーション一つに見えるよ・・・

プログラミング環境の表示を、シングルクォート2つがダブルクォートに見える
ようにしておくのはマヌケの3乗だよ。
019216905/01/30 17:50:47
>>181
一体どれを信じればいいんですか?
search.plは今もちゃんと使えるんですか?
0193デフォルトの名無しさん05/01/30 17:55:10
>>192
\sの意味調べればわかんだろ。
019416905/01/30 17:56:00
↑追加
search.plで検索すると
前は○○○×○とかだったんですけど
最近はeeee×eeとかで、串がまったく見つからないんですが
どういうことでしょうか?
原因と改善策を教えて下さい。
0195デフォルトの名無しさん05/01/30 18:02:28
>>191
プログラミングも好きだけどAAも好きなんだよヽ(`Д´)ノワーン
#2chブラウザだし
0196デフォルトの名無しさん05/01/30 18:09:00
>>190
ベンチマーク的には同じだった。
書きやすいから、漏れなら下の方を選ぶ。
0197デフォルトの名無しさん05/01/30 20:18:18
>>190
それはどんな場合の話?
printの引数なら "hoge",$hage にするよ

0198デフォルトの名無しさん05/01/30 20:48:11
>>190
100万回やったら上のが早かった
Winだけど
0199デフォルトの名無しさん05/01/30 21:13:44
>>191
Visual Studioはどうしてる?
0200デフォルトの名無しさん05/01/30 21:38:47
>>188
これなんで?
0201Rubyist!05/01/30 21:55:49
なんつーか技術レベルの低い奴に限ってどーでもいい些事にこだわるよなw
0202デフォルトの名無しさん05/01/30 22:20:42
>>201
細かいことにこだわらないようじゃプログラマ失格だな。
0203Rubyist!05/01/30 22:30:03
188みたいなのはあくまで「どーでもいいこと」であって「細かいこと」じゃねえよ。話をすり替えるなアホ
0204デフォルトの名無しさん05/01/30 22:46:50
>>200
\による意図しない展開を避けるため。
0205デフォルトの名無しさん05/01/30 23:07:23
>>204
そ、それだけすか?それだけのために '' にしろと言われても・・・
0206デフォルトの名無しさん05/01/30 23:10:26
どこに''にしろって書いてあるんですかー
0207デフォルトの名無しさん05/01/30 23:16:38
>>206
>>188 に書いてますよね。

というか、私は \ による展開は '' の方が意図しないものになるように感じるんですよね。

% cat hoge.pl
print '\';
% perl hoge.pl
Can't find string terminator "'" anywhere before EOF at z.pl line 1.
0208デフォルトの名無しさん05/01/30 23:20:35
>>207
え、どこに?
0209デフォルトの名無しさん05/01/30 23:21:43
>>208
ああすいません、揚げ足取りしたかったんですかね。
書いてません書いてません。
0210デフォルトの名無しさん05/01/30 23:24:41
''にした方がいいってのは188の理由だけじゃないと思うけど。
0211100105/01/30 23:48:18
漏れは"は沢山使うとごしゃごしゃして汚いから
シングルクォート派だけど。
0212デフォルトの名無しさん05/01/31 00:08:31
>>211
ごしゃごしゃって"<tag name=\"hoge\">"見たいなケース?
そういう場合は、普通こうだろ
qq|<tag name="hoge">|
'の場合でもq|hoge'hoge|っと
0213デフォルトの名無しさん05/01/31 00:19:26
以下のようなデータベースサーバのログがあります.

1秒後 (処理時間2秒)
5秒後 (処理時間6秒)
13秒後 (処理時間9秒)
16秒後 (処理時間5秒)
…

サーバ開始時間を0秒として,それから何秒後にリクエストが来たか,
その処理時間は何秒だったか,というような形のログです.
このログデータを使い,プログラムで任意の数のクラスタサーバを用意して,
どうすれば一番効率の良い負荷分散をするプログラムを作ることがしたいのですが,
どういう構造にしたらいいのかわかりません.
たとえば3台のクラスタサーバを用意するとした場合,
1台目 … 0+ (3×0行目,3×1行目,3×2行目・・・)
2台目 … 1+ (3×0行目,3×1行目,3×2行目・・・)
3台目 … 2+ (3×0行目,3×1行目,3×2行目・・・)
というラウンドロビンで振り分けていくプログラムを作りました.
これはこれで1台でやるよりは効率よく処理できます.
しかし,これに加えて処理時間と到着時間が被っていないかで判定して振り分けるのがいいと思うのですが,
どういう制御文にしたらいいのかわかりません….
Perlで作らなければいけないのでここで質問させていただいたのですが,
どなたか知恵を貸していただけませんか.
読み込むログデータは冒頭のような形で固定です.
0214デフォルトの名無しさん05/01/31 00:19:31
一応シングルクオートの方がコンパイルは早いはず。
でも別にわざわざ気をつけるほどのことじゃないけどな。
0215100105/01/31 00:22:05
>>212
そうだね。そういう時は特にそうだね。
でも単純に
$foo = 'hoge';
$bar = 'hage';
$baz = 'zure';
というときもシングルクオートにしちゃうね。
エスケープがうんぬんというよりも、
見た目が単に綺麗じゃないよね。ダブルクォートって。
フォント変えれば心も変わるかもしれないけどね。
021621305/01/31 00:22:47
正確にはログデータには日本語は入っておらず,

1.42423_2.53556
5.24524_6.35352
13.43663_9.59301
16.93821_5.23428
・
・

という形です.
『_』はスペースです.
0217デフォルトの名無しさん05/01/31 00:27:46
>>214
そんなに違いますかね?
コンパイル時ってことは評価されるのは一度だけですよね?
0218デフォルトの名無しさん05/01/31 00:30:23
>>214
え?
評価可能なパターンが入っているかどうか、
いやらしい眼でなめずるように見るか、
それとも見ないかの違いじゃないのか?

実行時に作用しないか?
0219Hiro5805/01/31 00:40:18
今バイトでCGI(perl)を作る仕事をしてますが、バイト先の人がperlだと素人みたいだからほかの言語で作ってほしいといわれてしまいました。
perlは素人の言語なのでしょうか?その会社の人はphpかaspとかいっているのですが、わざわざ変える必要はあるのでしょうか?
0220デフォルトの名無しさん05/01/31 00:45:34
>>219
じゃあ、なでしこで。
0221デフォルトの名無しさん05/01/31 00:48:02
>>219
はてなのシステムはPerlだそうだが。
phpのほうが素人っぽくないか…?
0222デフォルトの名無しさん05/01/31 00:49:09
あれだ、顧客に変な知識がついてんだろう。
0223デフォルトの名無しさん05/01/31 00:53:11
>>219
そんなことないと思うが、その場で反駁できなかった時点で負けと思ってほかの言語で頑張れ。
0224デフォルトの名無しさん05/01/31 01:01:57
>>219
その会社の人は間違いなく素人
違うところでバイトした方が君のためだ
0225デフォルトの名無しさん05/01/31 01:02:37
>>219
顧客の見たPerl感はPerl4と個人サイトの掲示板なんだろうなぁと想像
とりあえずPerl5で作って、Perlで作られているものの代表例を言ってみることをお勧め。
Movable Typeとか。
0226デフォルトの名無しさん05/01/31 01:48:25
スレ違いかも知れませんが、
御存じなら教えていただけないでしょうか?
TL10DにUpdate kitを当てた状態で、
Perl/Tkを使いwedgitに日本語を表示させたいのですが文字化けします。
Tcl/Tkのwishでは問題なく表示されているので、
Perl/Tkの問題のように思いますがGoogleでも、
TurboのHPでも有効な情報は検索できませんでした。
環境は以下の通りです。どうぞよろしくお願いします。
tcl-8.3.5-18
perl-Tk-800.023-4
perl-5.8.0-11
0227Hiro5805/01/31 01:50:45
なるほど。やはりperlでも問題ないですよね。顧客に吹きこまれたかw
まあ、社員はみんな良い人で社長もいい人☆バイト代もたくさんもらえるので
がんばってperlで続けてみます。

そういえばaspだとすごいWebアプリが作れそうな気がするのですが…。
ユニクロとかaspだし。でも簡単にはできないですよね。。

>>224
その通りです。会社で誰も作れる人がいないのでバイトの自分がプログラム
してます。


0228デフォルトの名無しさん05/01/31 02:08:46
perlでこんなことが出来る、って感じの書籍やサイトはありませんか?
0229デフォルトの名無しさん05/01/31 02:17:18
>>228
>>3
テンプレくらい嫁
0230デフォルトの名無しさん05/01/31 02:25:08
>>227
>aspだとすごいWebアプリが作れそうな気がするのですが…。
試してみれば?
ttp://www.microsoft.com/japan/users/recipe/
ttp://www.microsoft.com/japan/msdn/asp.net/webmatrix/
0231デフォルトの名無しさん05/01/31 02:29:10
>>227
まあ、PerlにもWebアプリケーションフレームワークは色々あるみたいだし。
0232デフォルトの名無しさん05/01/31 02:47:18
>>227
お前の腕次第だ。馬鹿。
asp使ってもお前にはすごいWebアプリが作れるとは思えない。
0233デフォルトの名無しさん05/01/31 02:53:09
Perl PHP ASP、どれも一定の機能を備えてるから、
ウェブ開発で不可能なことは無いしね。作る人次第だ
0234Hiro5805/01/31 02:58:55
>>230
visualC#でもやってみようかと。。どちらにしろ、そこまで大きな依頼は
無いのでやはり必要ないかもしれないですね(スイマセン)今のところHPの管理ページ
のみなので。(ショッピングカートや在庫管理など)

>>231
Webアプリケーションフレームワークありました。とりあえず「Sledge」を見つけたのですが、スクリーンショット
など無くて、どのようなもんか想像できないです(泣)
0235デフォルトの名無しさん05/01/31 03:03:34
Jakarta でも眺めて何でもできる気分にでもなってくれ。
0236デフォルトの名無しさん05/01/31 04:02:05
>>226
WINのActivePerlなら、下のコードで こんにちは と
確かに表示できるので、use encoding "cp932"; とSJIS指定してる
ところで、EUCでも指定すれば、出来ると思うけどなぁ。
(ActivePerlでは、cp932と指定しないと化ける)

use Tk;
use encoding "cp932";
$mw = MainWindow -> new;
$lb = $mw -> Label(-text => "こんにちは!", -font => 'System') -> pack();
MainLoop;
0237デフォルトの名無しさん05/01/31 15:41:33
>>Hiro58

 Cやshでも使ってやれよ。
0238デフォルトの名無しさん05/01/31 15:41:38
>>234
>のみなので。(ショッピングカートや在庫管理など)

B2C?
SSL とか 負荷分散とか FW までヤラサレル悪寒 (((( ;´ω`))) カクカクプルプル
0239デフォルトの名無しさん05/01/31 21:18:27
$aが abcdefghiの値のいずれかの場合というifをつくるとき
if($a==/[abcdefghi]/){〜〜〜}
でいいのでしょうか?
0240デフォルトの名無しさん05/01/31 21:23:29
eq
0241デフォルトの名無しさん05/01/31 21:23:53
>>239
やりたいのはこういうことかな
if($a !~ /[^abcdefghi]/){〜〜〜}
0242デフォルトの名無しさん05/01/31 21:25:09
こうでは?
if ($a =~ /\A[abcdefghi]\z/) { 〜〜〜 }
024324105/01/31 21:29:42
なるほど最初と最後の一文字でやるんですね
=~でしたね

すみませんでした。
0244デフォルトの名無しさん05/01/31 21:35:54
ひねくれてみた。
if ($a =~ tr/abcdefghi// == 1) {〜〜〜}
0245デフォルトの名無しさん05/01/31 21:38:12
>>239
if (-1 < index('abcdefghi', $a)) {
;
}
0246デフォルトの名無しさん05/01/31 21:40:15
>>242
\Z のZは、小文字でも良いんだっけか?
if ( $a =~ /\A[a-i]\Z/ ) { 〜〜〜 }
0247デフォルトの名無しさん05/01/31 21:54:30
>>246
違うものだよ。

\Z Match only at end of string, or before newline at the end
\z Match only at end of string
0248デフォルトの名無しさん05/01/31 22:18:24
>>247
大文字Zだと$aの中身が "a\n" でもマッチしちゃうのね。
納得。お勉強になった。つか、ずっと勘違いしてた。
ご指摘、サンクスです。
0249デフォルトの名無しさん05/01/31 22:20:58
>>246
と書く前にさっとマニュアルを見るという行動が
なぜ出来ないのかと。
0250デフォルトの名無しさん05/01/31 22:30:12
>>249
\z って、最近実装されたんでね?
0251デフォルトの名無しさん05/01/31 23:22:45
>>236
御親切に御回答いただき有難うございます。
残念ながら御指摘の点を以下のように変更し実施しましたが、
文字化けの現象を回避するには至りませんでした。
暇を見付けて、もう少し検証を続けてみようと思っております。
有難うございました。

use encoding "euc-jp";
0252デフォルトの名無しさん05/01/31 23:25:32
>>250
> \z って、最近実装されたんでね?

それで?
いや、だから、

% perldoc perlre

に相当するアクションを行なわないのはなぜかと。
どういう問題があるの?

Winだと、添付マニュアルは、htmlで提供されてい
たりするんだっけ。
0253デフォルトの名無しさん05/01/31 23:32:00
>>245
それ間違ってねえ?
0254デフォルトの名無しさん05/02/01 01:03:18
配列の要素数を知りたいとき,

$num = @array;

でわかりますよね。
では,配列の配列(リストのリスト) の要素数を知りたい場合はどうすればいいでしょう?

たとえば,
1年1組は生徒数30人
2年1組は生徒数32人
3年1組は生徒数31人
という学校を,
@array[学校のクラス][各クラスにいる生徒の数]
という配列に当てはめたとき,

$num = @array;

とすると「$num = 3」(クラス数)になります。
そうではなくて,
num[1] = 30(1年1組)
num[2] = 32(2年1組)
num[3] = 31(3年1組)

という感じで各クラスの数を知りたい場合にはどうすればいいでしょうか?
0255デフォルトの名無しさん05/02/01 01:04:35
(誤)
という感じで各クラスの数を知りたい場合にはどうすればいいでしょうか?

(正)
という感じで各クラスの生徒数を知りたい場合にはどうすればいいでしょうか?


です。
すみません。
0256デフォルトの名無しさん05/02/01 01:04:52
perlで、Lan内へarpの問い合わせが出来るようなライブラリはありませんで
しょうか?
0257デフォルトの名無しさん05/02/01 01:09:32
>>256
質問する前にsearch.cpan.orgで調べようと思わんのか?あーん?
0258デフォルトの名無しさん05/02/01 01:11:05
>>254
まず、その配列の配列の実装方法わかってる?
(@arr1, @arr2)じゃ駄目、リファレンスを使う。
リファレンスについて調べれば自ずと方法がわかるはずだ。
■ このスレッドは過去ログ倉庫に格納されています