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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/06/02(金) 23:43:29
"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/06/02現在の最新版: 5.8.8
● 2006/06/02現在の開発版: 5.9.3

リンク集は>>2-3
過去スレは>>4
0002デフォルトの名無しさんNGNG
[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: http://www.site-cooler.com/kwl/perl/

[本]
リャマ: http://www.oreilly.co.jp/books/4873111269/
駱駝: http://www.oreilly.co.jp/books/4873110963/
Effective Perl: http://www.ascii.co.jp/books/detail/4-7561/4-7561-3057-7.html
クックブック: http://www.oreilly.co.jp/books/4873112028/

[オンラインマニュアル] (追加)
最新のドキュメント: http://search.cpan.org/~nwclark/perl-5.8.8/
perl5.8.xのドキュメント(一部): http://www.kt.rim.or.jp/~kbk/perl-5.8/
perl5.005_03 のドキュメント: http://www.kt.rim.or.jp/~kbk/perl5.005/
日本語ドキュメント検索: http://www.cpan.jp/search.cgi
perldoc.jp: http://www.perldoc.jp/
Perldoc.com: http://www.perldoc.com/
0003デフォルトの名無しさんNGNG
[モジュール]
CPAN.com: http://search.cpan.org/
河馬屋二千年堂: http://homepage3.nifty.com/hippo2000/

[テクニック]
Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm
Perlのページ: http://homepage1.nifty.com/nomenclator/perl/
Perlの小技: http://homepage3.nifty.com/hippo2000/perltips/index.htm

[Perl5.8Unicodeメモ]
http://www.pure.ne.jp/~learner/program/Perl_unicode.html
http://www.namazu.org/~tsuchiya/perl/perl-5.8.html
http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
0004デフォルトの名無しさんNGNG
[過去ログ]
1 ttp://pc.2ch.net/tech/kako/1017/10177/1017736187.html
2 ttp://pc3.2ch.net/tech/kako/1033/10336/1033688230.html
3 ttp://pc2.2ch.net/tech/kako/1041/10412/1041205885.html
4 ttp://pc2.2ch.net/tech/kako/1048/10485/1048519394.html
5 ttp://pc5.2ch.net/tech/kako/1053/10530/1053053082.html
6 ttp://pc5.2ch.net/tech/kako/1060/10606/1060689008.html
7 ttp://pc2.2ch.net/test/read.cgi/tech/1068051036/
8 ttp://pc2.2ch.net/test/read.cgi/tech/1074151549/
9 ttp://pc5.2ch.net/test/read.cgi/tech/1079114157/
10 ttp://pc5.2ch.net/test/read.cgi/tech/1085564875/
11 ttp://pc5.2ch.net/test/read.cgi/tech/1090889189/
12 ttp://pc5.2ch.net/test/read.cgi/tech/1094579428/
13 ttp://pc5.2ch.net/test/read.cgi/tech/1097851764/
14 ttp://pc5.2ch.net/test/read.cgi/tech/1101649274/
15 ttp://pc5.2ch.net/test/read.cgi/tech/1105953092/
16 ttp://pc8.2ch.net/test/read.cgi/tech/1111034732/
17 ttp://pc8.2ch.net/test/read.cgi/tech/1117870308/
18 ttp://pc8.2ch.net/test/read.cgi/tech/1121804136/
19 ttp://pc8.2ch.net/test/read.cgi/tech/1126977805/
20 ttp://pc8.2ch.net/test/read.cgi/tech/1131286411/
21 ttp://pc8.2ch.net/test/read.cgi/tech/1134327348/
22 ttp://pc8.2ch.net/test/read.cgi/tech/1138519327/
23 ttp://pc8.2ch.net/test/read.cgi/tech/1141742901/
24 ttp://pc8.2ch.net/test/read.cgi/tech/1146022352/
0005デフォルトの名無しさん2006/06/02(金) 23:59:22
乙
0006デフォルトの名無しさん2006/06/03(土) 00:16:38
タモリ倶楽部が始まった
0007前スレ9802006/06/03(土) 00:22:36
>>1乙。つかありがとう。普通に気づいてなかった。
0008デフォルトの名無しさん2006/06/03(土) 02:52:27
>>1
Ζ
0009デフォルトの名無しさん2006/06/03(土) 07:34:07
useについて質問です。
a.plとb.pmという二つのファイルは同じディレクトリにあります。

#--a.pl--
use b;

printString();

#--b.pm--
package b;

sub printString(){
  print "aaa";
}

sub import() {
  *{"main::printString"} = \&printString;
}

1;

この状態でa.plを実行すると
&main::printStringサブルーチンが見つからないとエラーになります。
どこか間違っていますか?
0010デフォルトの名無しさん2006/06/03(土) 07:57:36
>>9
bというモジュール名がまずい。モジュール名をhoge等に変えるべし。
標準モジュールにBと言うのがあって、こっちが読み込まれてしまっている。
ttp://search.cpan.org/~nwclark/perl-5.8.8/ext/B/B.pm

ところで、それをやるならExporterを使うのが一般的だけれど、単に練習かな?
ttp://search.cpan.org/~nwclark/perl-5.8.8/lib/Exporter.pm
001192006/06/03(土) 09:16:55
>>10
use bなのにBが読み込まれちゃうんですね。
ありがとうございます。すっきり解決しました。
おっしゃる通り練習です。
続・初めてのPerlってのに載っていたimportの
練習でした。
0012デフォルトの名無しさん2006/06/03(土) 09:46:58
だから "a" と "b" はまずいとあれほど……
0013デフォルトの名無しさん2006/06/03(土) 09:53:19
"c"以降は問題ないのけ?
0014デフォルトの名無しさん2006/06/03(土) 10:32:36
O.pm ってのもあるし……
0015デフォルトの名無しさん2006/06/03(土) 12:00:37
am.pm ってのもあるな
0016デフォルトの名無しさん2006/06/03(土) 13:14:32
前スレ>>998
>Rubyに完全に取って代わられちゃったね。
>正確に言えば、まともなプログラマはみんなRubyに流れちゃって、
>自分が書いたコードの効率もろくに把握できていないようなアホだけが
>未だにぶら下がっている・・・っていう、ある意味過疎より酷い惨状だけど。
>>999
>>998
>3年前の状況としてなら賛成。
この頃ruby基地からのアラシが少なくなったと思ったらまた出たか。
漏れはPerlの方が速いし、モジュールが充実してるからPerl使ってる。
0017デフォルトの名無しさん2006/06/03(土) 13:17:16
>>16
おまえも荒らしに加担してるのわかってんだろうな?
0018デフォルトの名無しさん2006/06/03(土) 13:50:47
>>17
お前も俺もな。

遠巻きに眺めながらそっとしておいてあげるのが最高のスルーション。
0019デフォルトの名無しさん2006/06/03(土) 13:58:35
前スレ 974 氏
解決済みだろけど書いてみた。
print do { local $/ ; <> } =~ /.*?(([^¥n]*?¥n){1000})¥Z/ ;
一行だ。
0020デフォルトの名無しさん2006/06/03(土) 13:59:57
さあ華麗にスルーして、話題を強制的に質問と回答に戻そう。

前スレ>>988
| 988 名前:デフォルトの名無しさん:2006/06/03(土) 00:29:18
| Template Toolkitで使用する
| テンプレートファイルをうまくデバッグする方法はありませんか。
|
| テンプレートに誤りがあるときのエラーメッセージ
| は決まって "Bad file descriptor at ..."であり、
| テンプレート修正の手がかりになりません。
TT使ったこと無いんだけど、簡単なのを書いてみてもエラーの箇所が表示されるし、
モジュール内を検索してもそのエラーメッセージが出てこなかった。
再現用のサンプルを出して貰えると使ったことの無い人でも調べて回答できるかも。
0021デフォルトの名無しさん2006/06/03(土) 14:01:23
と思ったら 1000 行以下がでないじゃん。

my $data = join '', <> ;
$data =~ s/.*?(([^¥n]*?¥n){50})¥Z/$1/s ;
print $data ;
0022デフォルトの名無しさん2006/06/03(土) 14:06:27
>>21

>print do { local $/ ; <> } =~ /.*?(([^¥n]*?¥n){1000})¥Z/ ;
{1000} を{1,1000} にすりゃいい話だ罠。
0023デフォルトの名無しさん2006/06/03(土) 14:54:40
$list = qw(0 1 2)[2];
これって無名配列なの?
0024FLH1Aau016.gnm.mesh.ad.jp2006/06/03(土) 15:30:03
>>23
それは単なるリスト(のスライス)
リスト=スカラーコンテキストでは最後の要素を返す
配列=スカラーコンテキストでは要素数を返す
ということで、一応区別はある。
ちなみに無名配列そのものをその場でつくることは出来ないが、あえて書くなら
@{[0, 1, 2]}/${[0, 1, 2]}[0]とか、こんな感じでつくることは出来る。まぁ、リストがあれば事足りるのでする価値はないが。
0025232006/06/03(土) 15:33:58
そっかリストと配列は違うものなんだね
ありがとうございます
0026デフォルトの名無しさん2006/06/03(土) 15:34:23
ttp://search.cpan.org/~nwclark/perl-5.8.8/pod/perlglossary.pod#anonymous
| Anonymous
無名(匿名)
| Used to describe a "referent" that is not directly accessible through a named "variable".
名前付けられた変数を通して直接的にアクセスできない指示物(=リファレンスの指す物)を言います。
| Such a referent must be indirectly accessible through at least one "hard reference".
そのような指示物は一つ以上のハードリファレンスを通して非直接的にアクセスしなければなりません。
| When the last hard reference goes away, the anonymous referent is destroyed without pity.
最後のハードリファレンスが消えたときに、無名の指示物は容赦なく消されます。

って所か?訳の正確性はまったく保障しないが
0027デフォルトの名無しさん2006/06/03(土) 15:49:44
うほっ、名前間違えた…('A`)
0028デフォルトの名無しさん2006/06/03(土) 16:40:21
>>24
知らなかった。
sub s1 {
 return qw(a b c);
}
sub s2 {
 return my @x=qw(a b c);
}
sub s3 {
 my @x=qw(a b c);
 return @x[0..$#x];
}
とすると、scalar &s1 は c , scalar &s2 が 3 , scalar &s3 が c なのか。
戻り値のリストと配列は、意識の片隅に入れておいた方が良いのかも。
0029デフォルトの名無しさん2006/06/03(土) 17:13:06
>>28
どういった時にそんな使い方するのか
片隅に入れるならwantarray
0030デフォルトの名無しさん2006/06/03(土) 17:43:42
ふたつのふぁいるをひらいてそれぞれのぎょうをひかくしてじょうけんがあえばあたらしいふぁいるにそのぎょうをかこうしたものをかきこんでいくばあい
whileをいれこにしてやってるんですがもっとこうりつてきなものはありますか?
0031デフォルトの名無しさんNGNG
ねーよw
0032デフォルトの名無しさん2006/06/03(土) 18:00:06
Template Toolkitで使用する
テンプレートファイルをうまくデバッグする方法はありませんか。

テンプレートに誤りがあるときのエラーメッセージ
は決まって "Bad file descriptor at ..."であり、
テンプレート修正の手がかりになりません。
0033デフォルトの名無しさん2006/06/03(土) 18:03:03
答え=ヒントありましたね。二重質問失礼しました。
0034デフォルトの名無しさん2006/06/03(土) 18:08:45
これからラーメン食べに行きます。
0035デフォルトの名無しさん2006/06/03(土) 18:29:41
>>32
これってはてなで全く同じ質問を見たんだけど……
本人? 回答予定者?
0036デフォルトの名無しさん2006/06/03(土) 18:31:03
>>30
釣りだろうけど暇だから書く。
>ふたつのふぁいるをひらいてそれぞれのぎょうをひかくして
ここから判断して二つのファイルの行数は一緒。
my @one ; # 一つ目のファイルの中身
my @two ; # 二つ目のファイルの中身
for ( my $i = 0 ; $i <= $#one ; $i ++ ){
 # $one[$i] と $two[$i] を比較しろ!
}
0037デフォルトの名無しさん2006/06/03(土) 19:00:52
っていうかよ、ファイルが馬鹿でかかったらどうすんだ?
0038酩酊 ◆TWARamEjuA NGNG
片方をハシュキーにしたいよなぁ。
でも巨大なファイルだとあぼーんしちゃいそう。。。
0039酩酊 ◆TWARamEjuA NGNG
内容をMD5にしちゃうと、ちょっとはマシかな?
# キー作成
my $MD5_value = Digest::MD5->new;
my %hash = map {
$MD5_value->add($_);
($MD5_value->hexdigest, 1)
} <FH>;
みたいなみたいな。。。
0040酩酊 ◆TWARamEjuA NGNG
あ、これじゃ値がおかしゅくなるか(哀)

my %hash = map {
my $MD5_key = $MD5_value;
$MD5_key->add($_);
($MD5_value->hexdigest, 1)
} <FH>;

もちょっと最適化できそうな。。。
0041デフォルトの名無しさん2006/06/03(土) 20:31:23
最初の質間者が臣大ファイルを相手にしてるとは思えないが、
俺だったら
1.コマンドのsplitかまして、それぞれに>>36
2.素直に両方のファイルをseekして、それに>>36を適用
する。むろん検索ミスがおこらない様にポインタをずらしながら。

行が合ってないとかだったら「条件」によって変わるなあ。
0042デフォルトの名無しさん2006/06/03(土) 20:49:29
物理とかの分野だとやたらと巨大なファイルが出来上がるものもあるので、
一発読み込みは危険。
同じデータを違うソフトで使いまわすときもあるので、同じ行番号って縛りはなくしたほうがいいな。
0043デフォルトの名無しさん2006/06/03(土) 21:03:57
>>30
diffを参考にするのはどうよ?
0044デフォルトの名無しさん2006/06/03(土) 21:14:19
>30の言うとおりに書くと、
open (my $in1,'file1') or die
open (my $in2,'file2') or die
open (my $out,'>result') or die;
while (defined(my $val_1=<$in1>){
 my $val_2=<$in2>;
 if (比較条件($val_1,$val_2)){
  print $out 加工($val_1,$val_2);
 }
}
となって、どこでwhileが入れ子になるのかわからんのだが....

いつの間にか、同一かどうかを比較する話になっているが、
2つのファイルの各行の比較というと、 $val_1 > $val_2 といった条件もあるわけですよね?

もし、同一かどうかを比較するなら、open (my $in ,"diff $file1 $file2|") とやる方法もある。
0045デフォルトの名無しさんNGNG
エスパーだらけだな
0046デフォルトの名無しさん2006/06/03(土) 21:30:26
perlで\nを検索する正規表現ってどうしたらいい?
0047デフォルトの名無しさんNGNG
/\n/s
0048デフォルトの名無しさん2006/06/03(土) 21:39:18
>>47
ありがとう。
\nという文字そのものを検索するにはどしたらいい?
0049デフォルトの名無しさんNGNG
\\n
0050デフォルトの名無しさん2006/06/03(土) 21:42:04
>>42
Bio分野の者だが。

500Mbくらいのテキストだったら平気でまる飲みさせて
るしまる飲みできるぞ。undef $/; して。
1Gを越えた時はさすがにseekしたが。
そんなに何千万行ものデータが出るのか?物理分野って。

#perli.5.005時代はもちろんまる飲みなんてさせてません。
0051デフォルトの名無しさん2006/06/03(土) 21:45:12
>>49
ありがとう。
最後に空行にみえてしまう行を検索するにはどうしたらいいですか?
空行を検索するのはできるんですが。
0052デフォルトの名無しさんNGNG
sorry, this 2ch is japanese only.
0053デフォルトの名無しさん2006/06/03(土) 21:54:55
>>50
ヒント:メモリ
0054デフォルトの名無しさん2006/06/03(土) 21:54:55
ごめん。質問訂正いたします。

目でみると実際は空行に見えるが、tabが入っていて
実は空行ではない。のを検索するにはどうしたらいいですか?
その他の空行ではない行でtabが入っていても無視する。
というものです。

0055デフォルトの名無しさん2006/06/03(土) 21:55:34
>>54
その質問はここでしていい質問じゃない。帰れ。
0056デフォルトの名無しさん2006/06/03(土) 21:57:16
^\s+$
0057デフォルトの名無しさん2006/06/03(土) 21:58:26
>>56
氏ねキチガイ。
0058デフォルトの名無しさん2006/06/03(土) 22:02:36
>>54
すまん失念してた。>メモリの事。
0059デフォルトの名無しさん2006/06/03(土) 22:02:50
>>56
自演荒らし乙。
0060デフォルトの名無しさん2006/06/03(土) 22:06:16
>>58
なぜ54にレス?
にしても500メガPerlで生で読めるPCって個人で持ってるの?
うちの研究室じゃPCに回す予算なんてないから、メモリ増設したい奴は自費でやれ、だよ。
0061542006/06/03(土) 22:06:27
タブを検索するのは簡単なんですが、
空行に隠れるタブのみを検索したいんです。
0062デフォルトの名無しさん2006/06/03(土) 22:15:54
>>60
レスみすったw
うちは「メモリは消耗品予算で買えるからOK。PCは予算がない!」
てんで5年前のMacに積めるだけのメモリを積んでますw
0063デフォルトの名無しさん2006/06/03(土) 22:29:19
>>44
どーしても突っ込みたくなった。
my $val_2=<$in2>;
file2は先頭行しか見ないのか?
0064デフォルトの名無しさん2006/06/03(土) 22:32:24
>>63
なんで?file1のwhileループが回ってる間、一行ずつfile2からも引いてると思うが
0065デフォルトの名無しさん2006/06/03(土) 22:39:10
>63
<FH>の意味と使い方を調べてごらん。
0066632006/06/03(土) 22:43:33
…吊ってくるorz…
0067デフォルトの名無しさん2006/06/04(日) 00:39:09
CGI::Prettyを使って、ちょっと大きめのテーブルを表示し
ようとしたんです。
32文字ぐらい *16列 * 4098行 = 2M 程度。
メモリは2ギガ積んでいます。
しかし、実行するとメモリの使用率がガンガン上がって
いって止まってしまうんです。
use CGI::Pretty をコメントアウトすると問題ありません。
テーブルのサイズが小さいときは問題ありません。
なぜでしょう?
CGI::Pretty は使わないほうが速いというのはわかるんです
が、使わないと、HTMLソースがすごく見にくいので、できれ
ば使いたいんです。
CGI::Pretty って\tと\nを入れているだけにしか見えないの
ですが、そんなにメモリを使用するものなのでしょうか?
Windows,Linuxどちらでも、以下のスクリプトでも再現しました。
use strict;
use CGI qw(:standard);
use CGI::Pretty;
my @trs;
my @tds=qw(0 1 2 3 4 5 6 7 8 9 a b c d e f);
push @trs,td({bgcolor=>'#FFFFFF'}, \@tds) for (0..4097);
print table(Tr \@trs);

どこが問題なのでしょう?
0068デフォルトの名無しさん2006/06/04(日) 01:03:32
WebProg板に行かないところ
0069デフォルトの名無しさん2006/06/04(日) 01:08:48
>>67 はブラクラ。
試したら、サーバがswapし始めて、応答しなくなった。
0070デフォルトの名無しさん2006/06/04(日) 01:18:45
それはブラクラと言わないような…
0071デフォルトの名無しさん2006/06/04(日) 01:21:29
>>67
ヒント:header,start_html
0072デフォルトの名無しさんNGNG
>>68
ワラタ
0073デフォルトの名無しさん2006/06/04(日) 01:28:45
IEは巨大なテーブルの表示に時間がかかる。
これはperlでなく、IEの問題。

そのスクリプトをtest.plという名前で保存して
perl test.pl >test.html
ってやってごらん。
perlの処理にはそんなにかかっていないはず。
0074732006/06/04(日) 01:42:18
スマソ。
試したら、perlの処理の問題でした。
IEの問題ってのは忘れてください。
0075デフォルトの名無しさん2006/06/04(日) 01:50:19
>>72
ウイルスコード貼り逃げ厨に笑ってもらえて光栄です><
http://pc8.2ch.net/test/read.cgi/php/1149089424/2
0076デフォルトの名無しさん2006/06/04(日) 03:37:29
>>75
これはひどい
0077デフォルトの名無しさん2006/06/04(日) 08:04:02
ぬるぽ
0078デフォルトの名無しさん2006/06/04(日) 09:19:28
やっぱりbe付けてる人は荒らしてばっかりだね。
0079デフォルトの名無しさん2006/06/04(日) 09:34:32
openするときの引数は''と""""の
どちらで囲んだ方が速いかなと思い
以下のベンチを取ったのですが
use strict;
use Benchamark;

timethese(100000, { TEST1=>'\sub1', TEST2=>'\sub2'});

sub1 {
open my $fh, "<", "test.txt";
}

sub2 {
open my $fh, '<', 'test.txt';
}

テスト結果が表示された直後
Can't call method "sub2" without a package or object reference at
となってしまいます。ちゃんとsub2をリファレンス渡ししてるのになんで・・・
一応テストはうまくいっているようなのですが
どこがおかしいですか?
0080792006/06/04(日) 09:49:34
ああ、死んできます
0081デフォルトの名無しさん2006/06/04(日) 10:00:48
Benchmark: timing 100000 iterations of TEST1, TEST2...
TEST1: 27 wallclock secs ( 7.73 usr + 16.20 sys = 23.93 CPU) @ 4178.16/s (n
=100000)
TEST2: 28 wallclock secs ( 8.01 usr + 15.89 sys = 23.90 CPU) @ 4183.23/s (n
=100000)

Bechmarkの結果についてなのですが、
上記のようなBenchmarkの結果はどちらが速いのでしょうか?
wallclockのところを見るとTEST1の方が速いように思いますが
消費したCPU時間を見てみるとTEST2の方が少ないようです
あと、@以降の部分は一秒間に回ったループの回数ですよね?
ということはTEST2の方が速いということなのでしょうか?
いったいどれを見たらよいのでしょうか・・・
0082デフォルトの名無しさん2006/06/04(日) 10:12:51
前スレで誰かが
use encodingはメンテナも推奨していない
と言ってましたが詳しく教えてください
今までjcodeとかでちくちくやっていたのを
(特にwinな環境なので)
ソースの最初にuse encoding 'sjis';
とするだけで漢字を含んだ正規表現も幸せ
に出来ていたので不安になってしまいました

確かソースをeuc-jpに統一しても日本語を含んだ
正規表現に関しては多くの問題は解決するけど
完璧には動かないんですよね?
それをencodingで解決できたと思っていたんですが
それがだめだとすると一体perlでの日本語処理は
どうすればよいのでしょうか?
0083デフォルトの名無しさん2006/06/04(日) 10:28:04
>>82
Perlの方向性としては、 ソースコードをUTF8で書き、use utf8 するというのがいいらしいです
http://www.pure.ne.jp/~learner/program/Perl_unicode.html
0084672006/06/04(日) 10:34:13
板違いすみませんでした。
WebProg板に行ってきます。

同じ質問を違う板に書いても、この場合はマルチじゃないですよね?
0085デフォルトの名無しさん2006/06/04(日) 10:36:54
>>67
CGI::Prettyの_prettyPrintというサブルーチンは、@CGI::Pretty::AS_ISにある
タグの間以外はインデントを追加する、という単純な動作なようだが、
かなり効率が悪いアルゴリズムになっている。

@CGI::Pretty::AS_ISに含まれるタグの対で文字列を前半分と後ろ半分に
わけてそれぞれ再帰してインデントつけたのを最後にくっつけるわけだが、
AS_ISに<td>..</td>が含まれているので、<td>の出現数分再帰し、
なおかつ途中経過の文字列が全部スタックに詰まれるので<td>の
数の2乗に比例した計算時間とメモリが使われる。

アルゴリズムを直してもらうかあきらめるかじゃないだろうか。
0086デフォルトの名無しさん2006/06/04(日) 10:37:10
package hoge;
use strict;

と書くのと

use strict;
package hoge;

と書くのは何か違いがあるのでしょうか?
0087デフォルトの名無しさん2006/06/04(日) 12:04:50
>>82
use encodingで起こりうる問題を把握して使っていれば問題ないと思うよ。
分かってないとハマる可能性があるから、使わなくて済むなら使わないほうがいいってこと。

>>83の人も言ってるように、ソースはutf8で書いて、
入出力時にcp932その他に変換したほうが望ましいと思います。

ついでに言うと、Windowsでsjisを使うのはやめたほうがいいよ。
0088デフォルトの名無しさん2006/06/04(日) 12:57:04
>>86
はい、違いがあります。
strict プラグマはレキシカルスコープで効きます。
従って use strict; よりも前に書かれた package 宣言は strict によるチェックを受けません。
しかし、package 宣言において厳格さのチェックが必要になるケースはほとんどないのでこれが問題になることは稀です。

実際モジュールなどでは大抵、可読性のためにほとんどのコードに先んじて package 宣言を行うのが半ば慣例化しています。
通常はこの慣例に従うのが良いでしょう。
0089デフォルトの名無しさん2006/06/04(日) 12:59:38
>>87
> ついでに言うと、Windowsでsjisを使うのはやめたほうがいいよ。

Mac なら問題ありませんか?
0090デフォルトの名無しさん2006/06/04(日) 14:08:49
>>88
どうもありがとうございます。
ところでpackage宣言でstrictを要する場合ってほとんどないにしても
何かあるわけですか?さっぱり思いつかないんですが
どういう場合があるか教えてもらえませんか?
0091デフォルトの名無しさん2006/06/04(日) 14:11:02
>>87
どうもありがとう
そのuse encodingで起こり得る問題について
詳しく教えてもらえませんか?

あとWinでは入出力時にsjisではなくてcp932
を使えとのことですが、この二つって同じもの
じゃないのですか?どこが違うのですか?
0092882006/06/04(日) 14:22:11
>>90
ちょっと考えて、思いつかないことに気付いて笑っちゃった。w
うん、たぶんないね。ありがとう。軽く吊ってくるわ。
0093デフォルトの名無しさん2006/06/04(日) 14:31:22
>>91
一番大きな問題は encoding の効きが「グローバル過ぎる」こと。
use encoding; したスクリプトから呼び出されたモジュールの類にも見境無しに効く。
依存関係のどこかで、これが問題になるようなコードがあれば、その挙動の予測ができない。

cp932 については文字コード関係の文書をあたってみて。
要するに「両者が完全には一致していない」ということ。
0094デフォルトの名無しさん2006/06/04(日) 17:21:32
>>81
比べるべきはTotalだが、ほとんど有意差はみられない。
0095デフォルトの名無しさん2006/06/04(日) 18:13:10
トリップを生成するプログラムを作っているんですが、
2chで#アだとtsGpSwX8mo
自分の環境でトリップキーがアだとIApAHNvIKg
になります。なぜかトリップキーが2文字以上あればうまくいきます。
「あ」も「a」もだめでした。
ActivePerl5.8.8 Build 817です。
プログラム内容は
$tripkey="ア";
$salt = substr($tripkey.'HG', 1, 2);
$salt =~ tr/:;<=>?\@[\\]^_`/ABCDEFGabcdef/;
$salt =~ tr/\x80-\xFF/\x00-\x7F/;
$salt =~ tr/\x7B-\x7F/\x2e-\x32/;
$salt =~ tr/\x14-\x2D/\x61-\x7A/;
$salt =~ tr/\x00-\x13/\x47-\x5A/;
$trip = substr(crypt($tripkey, $salt), -10);
print $trip;
です。
何故でしょうか?どのようにしたら2chと同じトリップが出せるのでしょうか?
0096デフォルトの名無しさん2006/06/04(日) 18:17:58
ハードゲイじゃなくてH.
0097952006/06/04(日) 18:26:36
>>96
ありがとうございます。うまくいきました。
0098デフォルトの名無しさん2006/06/04(日) 20:03:25
サブルーチンの引数にハッシュを渡すことは可能ですか?

&foo(%hash);
sub foo {
%hash = $_[0];
print join "\n", keys %hash
}
とやってみたのですが、うまくいかないようです。
0099デフォルトの名無しさん2006/06/04(日) 20:12:15
サブルーチンの引数に配列を渡すことは可能ですか?

&foo(@array);
sub foo {
@array = $_[0];
print join "\n", @array
}
とやってみたのですが、うまくいかないようです。
0100デフォルトの名無しさん2006/06/04(日) 20:14:43
釣りだよね。
じゃなかったら本を読もうね。
0101デフォルトの名無しさん2006/06/04(日) 20:25:01
サブルーチンの引数にスカラーを渡すことは可能ですか?

&foo($scalar);
sub foo {
$scalar = $_[0];
print $scalar
}
とやってみたのですが、うまくいきました。

どう見ても釣りです。本当にありがとうございました
■ このスレッドは過去ログ倉庫に格納されています