"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
2 :
デフォルトの名無しさん :2006/10/31(火) 14:53:20
3 :
デフォルトの名無しさん :2006/10/31(火) 14:54:50
4 :
デフォルトの名無しさん :2006/10/31(火) 14:55:48
>>5 乙
罰ゲームで新スレたてて誰も慰みの言葉かけてくれなきゃ腐るわなw
>>前996 それは遅いと思い込んでいました。ありがとうございました。
毎行、空行後か判定するよりは、ループを2つに分けた方が効率がいいと思うんだ。 好みによるだろうけど(´・ω・) my (@head, @body); while (<FH>) { push @head, $_; last if /^$/m; } while (<FH>) { push @body, $_; }
こうか while (<FH>) { (/^$/) ? last : push @head, $_ } while (<FH>) { push @body, $_ } メールの処理かね。
前スレで学んだことを無理矢理活用w (/^$/ .. 0) ? push @body, $_ : push @head, $_ while (<FH>);
すいません、ベンチマークしましたが、どれもあまり差が出ませんでした。また明日いろいろ試してみます。
# ループを使わない例 (イロモノ) local $/ = "\n\n"; push @retsu, <FH>; @hai = split /(\n)/, shift @retsu, -1; # ネタなので効率とかは知らん
>>13 誰ひとりベンチなんか計らずにポストしてると思うがなw
1行目に空行があれば最速w while (<FH>) {/[^\s]/ ? push (@head,$_) : last;} @body = <FH>;
#!/Perl\bin\perl $file="tes.txt"; $outfile="k.txt"; open (IN, $file) or die "$!"; open (OUT, ">$outfile") or die "$!"; $file = ~s/ABC/XYZ/g; print out $file = ~s/ABC/XYZ/g; close (IN); close (OUT); 全く意味わからんのですが、ファイルを開いてABCをXYZに検索置換してk.txtに保存って どうやるのだろう
20 :
デフォルトの名無しさん :2006/11/01(水) 03:23:06
2つの配列があって10%の確立でどっちかの配列を選ぶプログラムを書きたいんですが、 どうやればいいですか? エロイ人お願いします。
>>19 ありがとう
while (<TEXTFILE>) {
s/ABC/xyz/g;
print "$_\n";
}
こんな感じの物があった。
23 :
21 :2006/11/01(水) 03:56:31
できたけど、なんか動かない=できてない #!/Perl\bin\perl $CSfile="CSfile.csv"; $TXfile="TXfile.txt"; $outfile="outfile.txt"; open (INTEXT, $TXfile) or die "$!"; open (INCSV, $CSfile) or die "$!"; open (OUT, ">$outfile") or die "$!"; while (<INCSV>) { # 改行コードの除去 chomp ($_); # 各行をカンマ区切りで分割 @data = split(/,/, $_); while (<INTEXT>) { s/$data[0]/$data[1]/g; print OUT "$_"; } } # ファイルハンドルを閉じる close(INTEXT); close (INCSV); close (OUT); どこかヘンですか?
強いて言うなら頭かな? まあ、上では while (<INTEXT>) { } は一回しか実行されないあたりとか大丈夫かな、っては思う。
>>23 $TXfileを最初に全部読み込んどけ。
>while (<INTEXT>) { } は一回しか実行されない あぁそれですねー どうすれば、動くようになりますかね?
>>26 どこに問題があるかは分かった?
INCSVを読んだあとINTEXTの置換に取りかかってて、そこまではまあ悪くない。
けどINCSVの1行目のループでINTEXTを最後まで読んじゃってるでしょう。
ファイルの読み書きにはファイルポインタっていう「しおり」みたいなのがあるのは理解してる?
INTEXTを最後まで読んじゃって「しおり」が最後にあるから、INCSVの2行目からの処理では
INTEXTを先頭から読めないじゃん?ってことね。
そのスクリプトの場合なら「しおり」であるファイルポインタを移動すりゃ思ったように動く。
頑張れ。
28 :
21 :2006/11/01(水) 04:44:02
ヒントをありがとう! perlを始めて10時間。なかなか難しいですねぇ もう少し、がんばってみます!!
いや、それ直してできたらできたとこで
>>23 だと、
$outfile に ($TXfile の行数 * $CSfile の行数) 分のデータが書き込まれそうなんだが、
これはわかってやってるのかね?
って 10時間かよwww
30 :
21 :2006/11/01(水) 04:55:05
テキストファイル100MB超えました。 ただ、検索置換したいだけなのに・・・・・
31 :
20 :2006/11/01(水) 05:19:11
20だけど こういう感じにしてみた。$rateに何パーセントの確立で選ぶ値が入ります。例えば10とか20とか。 でもこれだと絶対にX%の確立で一方が選ばれないんだよね。 誤差が2-4%ぐらいでる。 何か言い方法ありませんか? sub erabu{ my $rate = shift; my $divider = $rate/10; my $seed = 10/$divider; my $randomInt = int(rand($seed)); if ( $randomInt == 0 ) { return 0; } else { return 1; } }
なんだ、今日はやけに初心者が多いな(´・ω・)
>>31 print文などを使って、変数の値を確認することを勧める
34 :
21 :2006/11/01(水) 06:54:58
どう書き換えても($TXfile の行数 * $CSfile の行数)が出力されますな・・・
どう書き換えてもなるならしょうがないな。 それは呪いだよ。
#
>>31 $erabareta = 1 > rand 10;
・・・・しね
37 :
21 :2006/11/01(水) 08:50:01
のろい( ゜Д゜)<呪呪呪呪呪呪呪呪呪 もうちょっと勉強してみる。
38 :
20 :2006/11/01(水) 09:15:34
win32::OLEとsamieで IEを操作しようと思うのですが、 アドレスとソースの取得はどのようにやればいいのでしょうか?
40 :
キューチャン :2006/11/01(水) 10:37:07
oracle8*0*X 接続用perlモジュールDBD-Oracleをどうやって 手にいれるか知っている人いませんか? 教えてください 最新のものしかみつかりません
仲良くperlの話してるならなんでもいいよ。
$str[$nn]
perlのEncodeでiconvのEUC-JP-MSに相当するencodingは なんていうの?
>>46 Encode::EUCJPMSをインスコしてperldocでモジュールのドキュメント見ろ
>>44 北星学園か。俺が昔かかわったことのある学校だなあ。
で、その5ってその手前で作ったのを変更して作れってことだよな?
変更する前のプログラムは作ったのか?
>>48 これでよろしいでしょうか?
open(IN,"LIST.txt");
while( <IN> ) {
print $_ ; }
close (IN);
>>47 追加モジュールをインスコしないとだめなんすね。回答ありがとうございました。
このくらい標準で入れといてほしいけどここで言ってもしょうがないか...
>>49 それが4の答え? とするとそこからして間違いだと思うが。
まず4についてはね、ファイル開くのをいちいち自分で書く必要はなくて、
<>を使うと簡単。
@a = <>;
これだけで引数で指定したファイルまたはファイルを指定しなければ
標準入力からの入力が全部1行づつ @a に入る。文字列の数(行数)は
@a の数だ。これは @a を scalar として扱うだけでいい。これで
行数が出る。
print scalar(@a) . "\n";
で、@a の内容を全部表示するには
print @a;
でできる。
5はもう少し自分で考えろ。
>>50 日本人だけが使ってるわけじゃないからね。
そもそもEncode関連はサイズ大きいから、必要としていない言語圏の方々からは嫌われてるとか聞いたこともあるし。
それにEncodeを使えば簡単にEncode::EUCJPMSみたいなのが作れるんだから、他言語よりはマシな気がする。
53 :
デフォルトの名無しさん :2006/11/01(水) 23:37:58
本当に困っています。 行はいいのだが、列としてのあつかおうとすると 非常にめんどう(表計算ファイルとかのとき致命的) たとえば2次元配列のリファレンス $ref = ([ ],[ ], [ ]) があるとするとこれのそれぞれの 要素の第一成分を表示する 簡単な方法はないでしょうか? print @{$・・@$ref->[0]}; といったかんじでできない?
54 :
53 :2006/11/01(水) 23:44:18
いままで思いついた 簡単な方法は foreach (@$ref){ print $$_[0]; } ぐらいでもこれでもforeachとかかませて色々操作する必要がある 特に列間の計算とかすることになるとこれでは非常に 面倒 なにか一単語で簡潔にあらわせる方法があったはずなんだが・・・ おもいだせない
print map { $_->[0] } @$ref
56 :
53 :2006/11/02(木) 00:34:37
ありがと ただ @$\のくみあわせで print @{$・・@$ref->[0]}; といったぐあいに(@{@$ref->[0]} みたいなかんじ) で表現できたはずなんだ どうしてもできない おしえてほしい
>>56 perldoc perllol しても情報はないなぁ
> @part = @{ $AoA[4] } [ 7..12 ];
は単なる slice だし。
そういう方法があれば知りたいもんだ。
59 :
21 :2006/11/02(木) 08:49:43
#!/Perl\bin\perl $CSfile="CSfile.csv"; $TXfile="TXfile.txt"; $outfile="outfile.txt"; open (INTEXT, $TXfile) or die "$!"; open (INCSV, $CSfile) or die "$!"; open (OUT, "> outfile.txt") or die "$!"; @lines = <INTEXT>; $line_amount = @lines + 1; #行数計算 while (<INCSV>) { chomp ($_);# 改行コードの除去 @data = split(/,/, $_);# 各行をカンマ区切りで分割 for($i=0;$i<$line_amount;$i++){ $lines[$i] =~ s/$data[0]/$data[1]/g; } } print OUT @lines; close(INTEXT); close (INCSV); close (OUT); なんとなくできましたが、 速度が遅すぎる点と、結果が文字化けしている点がいかんともしがたい。 CSfile.csv=4万行以上・TXfile.txt=2万行程度(検索・置換は全て日本語です) 改善策をご指導ください。
>>59 置換対象のファイルを@linesに行ごとに入れてループでまわすよりは
全体を一つの変数$linesにいれてまとめて置換した方がたぶん速い。
$lines = do { local $/; <INTEXT> };
文字化けの原因はここに書いてある情報だけではないともいえないが
たぶんEUCかSJISそのままでやってるせいじゃないかと思うので内部は
unicodeにしたほうがいいだろう。全部一緒ならopenプラグマで
use open ':encoding(sjis)';
のようにすればまとめて指定できるはず。
62 :
21 :2006/11/02(木) 12:22:58
>>60 文字化けは、解消されました。
速度については、速くはなったと思いますが、それでも遅い感じがします。
perlの限界なのかな・・・・
いろいろありがとうございました!
63 :
21 :2006/11/02(木) 12:59:25
追記: 次はC言語でやってみたいと思います。 C言語も全くしたことないけど・・・・ 速いのかな・・・・
>>59 問題なのは行数よりサイズだと思うんだが・・・。
ってかそんな遅くなるとかどんなファイル扱ってんだよ('A`)
>>62 2万行の文字列を4万回置換だからそれなりに時間はかかるだろうな。
4万回s///するのと置換対象の文字列を全部 | でならべて
s/(文字列1|文字列2|...)/$h{$1}/g のようにするのとはどちらが
速いだろうか
あるいは発想を変えて、対応表を適当な有限状態オートマトンに
変換しといて置換対象の文字列を頭から食わすみたいな
アルゴリズムにするのもおもしろいかもしれない。
たとえば ab → d, ac → e
状態0:
aなら状態1へ
bなら状態2へ
それ以外はその文字を出力して状態0へ
状態1:
bならdを出力して状態0へ
cならeを出力して状態0へ
それ以外はaとその文字を出力して状態0へ
みたいな。
66 :
21 :2006/11/02(木) 14:07:01
(´ヘ`;)
Cならオブジェクト性能をマクロからミクロまで 自分でコントロールできるから試してみる 価値はあるな>63 OSコールが気に入らなきゃ、その部分を自分で 組み立てたっていいし
辞書は予めソートしておき、辞書の1文字目がもしtxtに出現しなければ 同じ出だし辞書は全部飛ばし、別の出だし単語へ。
69 :
68 :2006/11/02(木) 14:32:44
ソートしなくても、連想配列に1文字目該当無しフラグ作る等いろいろ。 $FG{'あ'}=1;
> 4万回s///するのと置換対象の文字列を全部 | でならべて > s/(文字列1|文字列2|...)/$h{$1}/g のようにするのとはどちらが > 速いだろうか /(文字列1|文字列2|...)/ より /文字列1/ or /文字列2/ or ... って分けた方が早いらしいよ。 ・・・って、どれかひとつにマッチしたら他にマッチしない前提なのかな
71 :
21 :2006/11/02(木) 15:21:50
C言語・・・こりゃ道程が遠いね
72 :
デフォルトの名無しさん :2006/11/02(木) 19:45:27
$max_buf = $size - $now_size if $size - $now_size < $max_buf; これで $now_size が $size より小さければ $max_buf は0になります。 $now_size が $size より大きければ $max_buf には $size より足りない数になります。 どうなるかは解ったのですが、そうしてこうなるのかが解りません。 どういう風に解釈したら良いのでしょう。 <例> $size = 12 $now_size = 10 $max_buf = 0 <例> $size = 10 $now_size = 12 $max_buf = -2
>>72 > $max_buf = $size - $now_size if $size - $now_size < $max_buf;
>
> これで $now_size が $size より小さければ $max_buf は0になります。
ちがう。if文が偽を返しただけだ。
>>73 ううん。
すみません、良くわかんないです。
ただ、理解する手がかりになりましたので勉強します。
回答をありがとうございました。
75 :
デフォルトの名無しさん :2006/11/03(金) 20:42:55
>>74 > $max_buf = $size - $now_size if $size - $now_size < $max_buf;
これは
if( $size - $now_size < $max_buf ){
$max_buf = $size - $now_size;
}
と同じです。っていうのは分かってるのかな・・・?
chompみたいに、引数を省略すると$_を処理するサブルーチンってどう書くの?
>>77 @_の要素数を見ればいくつパラメタが与えられたかわかるので
適当に分岐なりなんなりすればよい。
長い文章から正規表現で$1 .. $7まで取り出して使っているのですが、条件式が長くなってしまいます。 途中で改行したいのですが、実際に条件式の途中で改行するとエラーになってしまいます。 解決策を教えてください。 条件式 $hoge =~ /VALUE="(.*?)"(?:.|[^.])*?VALUE="(.*?)".*?VALUE="(.*?)".*?VALUE="(.*?)".*?VALUE="(.*?)".*?VALUE="(.*?)"(?:.|[^.])*>(\d+)(?:\(hugahuga\)|\(hogehoge\))/;
81 :
デフォルトの名無しさん :2006/11/05(日) 05:15:00
>>80 できました。
これ便利ですね。
どうもありがとうございました。
$hoge = "熊のプーさん"; $hoge =~ /プーさん/; を実行すると Unmatched [ in regex; marked by <-- HERE in m/プー <-- HERE さん/ at C:\hoge\test.pl とエラーになります。 パターンの先頭がパー、ピー、プー、ペー、ポーにだとエラーになるようです。 $hoge =~ /\プ\ー/; エスケープしてもうまくいきません。 どうしてでしょうか?
>>82 長音(ー)の2バイト目が 0x5B で、'[' (0x5B) として解釈されてしまうからです。
\Q と \E で囲むと、その間の文字列は正規表現として解釈されなくなります。
/\Qプーさん\E/
ではどうでしょうか?
85 :
デフォルトの名無しさん :2006/11/05(日) 17:56:01
SnUploaderについての質問です。 ファイルをアップすると[upxxxx.xxx]という名前に強制的になりますが、 これを[MAQxxxxx.MP4]という様にしたいです。 (xxxxxの部分は、アップされた順に00001,00002,00003という感じに) どうすれば良いのでしょうか? また、MP4ファイルをアップしそれを落とそうとしてファイル名のところを クリックすると、QuickTimeによって再生され、保存することが出来ません。 これを再生されること無く、ファイル名をクリックしただけでDLが始まるようにするのは どうすれば良いのでしょうか? 分かりにくい文章かもしれませんが、教えてください。お願いします。
87 :
デフォルトの名無しさん :2006/11/05(日) 19:12:36
>>86 え・・・
uploder.cgiの中身を書き換えるんじゃないんですか?
そうだと思ってPerlのスレにに書いたのですが・・・。
もしかして、ここじゃなくてCGIの質問スレに書くべきでしたでしょうか。
>>87 書き込みするまえに2chの使い方,板とスレのそれぞれのローカルを覚えろ。それまではROMってろ
そうまで言わなくてもいいだろ
「親切10回につき罵倒1回」を心がけましょう
92 :
82 :2006/11/06(月) 02:11:23
>>83-84 \Q, \Eを使って解決しました。
レスありがとうございました。
printで標準出力に送られた文字列ををログとしてテキストファイルにも保存したいですのですが、 今は下のようにめんどくさいことをしています。何かうまい方法はありませんか? print "ほげ"; print LOG "ほげ"; print "ふがふが"; print LOG "ふがふが";
>>93 perl のプログラムでは標準出力に出すだけ。
tee を使ってリダイレクトするか、
単にリダイレクトしてそのファイルを別端末で tail -f する。
>>93 open(STDOUT,"|tee log");
前スレで出ていたIO::Teeとか。
98 :
デフォルトの名無しさん :2006/11/07(火) 04:16:20
質問させてください。 $data { 'Class_A' } [ 0 ] { 'FirstName' } = '太郎' ; みたいな配列とハッシュを組み合わせた変数を用意しようと思います。 リファレンスとか多次元とかサブルーチンとかごちゃごちゃで混乱してます。 【1】変数の値を生成し、代入したい my %data; #(略。ループとかDBからの取得とか) my %hash; $hash{'FirstName'} = '太郎'; $hash{'FamilyName'} = '田中'; push ( @data{'Class_A'} , \%hash ); #(略。ループ終了とか) と書いてみたのですが、型が違ぇよボケ(意訳)と言われてしまいました。 (実際には、Class_Aや田中、太郎の部分にはデータベースから取得した値が入る) 仕方ないので、 my @tmp = @data{'Class_A'}; と、あらかじめコピーしておいてから、最後に push(@tmp,\%hash); @data{'Class_A'} = \@tmp; 一時ファイルの中身を戻すとかやってる始末です。 もうちょっとスマートな方法はありませんでしょうか。
99 :
デフォルトの名無しさん :2006/11/07(火) 04:17:50
なお、データベースから読み込んだとき、クラスごとや出席番号順に来るとは限りません。 A組→B組→B組→B組→C組→A組→C組 とかもありえます。 各クラスの生徒数は不明です。 【2】特定のクラスに所属する生徒の情報を取り出したい。 なお、取り出す順番(出席番号)については言及しない。もちろんしてもいい。 foreach my $key (keys @data{'Class_A'} ) というループを作ってみたのですが、最終的な値(田中とか太郎とか)を取得する方法が分かりません。 $data{'Class_A'}[$key]{'FirstName'} $key{'FirstName'} など幾つか試してみましたが、全く取得できる気配はありませんでした。 (どちらも「太郎」などの文字列の取得を期待しています)
>>98 push ( @data{'Class_A'} , ¥%hash );
のところを
push ( @{$data{'Class_A'} }, ¥%hash );
でいいんじゃないか
>>99 my %data;
#(略。ループとかDBからの取得とか)
my %hash;
$hash{'FirstName'} = '太郎';
$hash{'FamilyName'} = '田中';
push (@{$data{'Class_A'}},¥%hash);
foreach my $class ('Class_A', 'Class_B', 'Class_C') {
foreach my $student (@{$data{$class}}) {
print $student->{'FirstName'} . $student->{'FamilyName'} . "¥n";
}
}
102 :
98 :2006/11/07(火) 04:48:00
こんな遅くにも関わらずありがとうございます。 これ以上パソコンとお見合いしてると明日(というか今日)の仕事に響くので 検証は夜にでもやりたいと思います。 ほんとうにありがとうございました…… zzz
既に解決しているようだが質問するときはエラーメッセージは勝手に意訳せずに そのまま貼るのが基本。
もうちと解説してみる。 hashやlistの値として、直接 hash や list は格納できないが、リファレンスは格納可能。 従って、 $data{'Class_A'}->[0]->{'FirstName'} = '太郎'; ならOK。しかしややこしいことに、上記は $data{'Class_A'}[0]{'FirstName'} = '太郎'; と書いても同様に解釈される。これだと表記上、hash の値にlistが 格納されているように見えるが、実際には list のリファレンスが格納されている。 list のリファレンスなので、その全体は @{$data{'Class_A'}} で参照する。 @$data{'Class_A'} じゃダメ。
105 :
98 :2006/11/07(火) 20:02:45
ありがとうございます、無事に解決しそうです。 勘でコーディングするだけでなく、しっかりと何をしているか認識しないと駄目ですね。 Cのポインタはなんかはすぐに理解できたんですが、Perlはそれ以上に混乱しそうです。 >103 おっしゃる通りです。以後気をつけます。
↓のように、配列に変数を代入できますか? @array=($sec,$min,$hour,$day,$mon,$year);
>>106 質問するより
print join(',', @array) . "¥n";
で試した方がはやくね? 釣り?
やってみたのか?
>>107 ,108
実行できる環境じゃないんです;;
111 :
106 :2006/11/07(火) 21:11:55
print "aa";を実行するとaaと画面に表示されますか? 実行できる環境じゃないんです;;
20年くらい前は紙の上だけでプログラム書くのがプログラマだったんだっけ。
114 :
106 :2006/11/07(火) 21:23:36
もういいです C++でもJavaでもできるので、できるものとして書いていきます
いってらっしゃい
実行できる環境じゃないのに何のために書いてんだw
(´-`).。oO(そんなことを宣っているやつがC++だろうがJavaだろうが、はたまたObjective-C++2.0でもまともなことは出来ない伊予柑♪)
119 :
93 :2006/11/07(火) 23:19:58
$tee = new IO::Tee(\*STDOUT, ">>log.txt"); print $tee "ほげふが"; で解決しました。 レスありがとうございました。
<FORM ACTION="hoge.cgi" method="POST">
<INPUT TYPE=HIDDEN NAME=huga VALUE="huge">
<INPUT TYPE=SUBMIT NAME=ok VALUE="送信">
<INPUT TYPE=SUBMIT VALUE="取り消し">
</FORM>
これを送信したいんですが下のようにすると取り消しが送られてしまいます。
どうすればいいですか?
$string = "上のHTML";
$url = '
http://hoge/hoge.cgi ';
$string =~ /NAME=huga\sVALUE="(.*?)"/;
%formdata = ('huga' => $1);
$ua = LWP::UserAgent->new;
$req = POST($url, [%formdata]);
$res = $ua->request($req);
$string = <<EOF;
<FORM ACTION="hoge.cgi" method="POST">
<INPUT TYPE=HIDDEN NAME=huga VALUE="huge">
<INPUT TYPE=SUBMIT NAME=ok VALUE="送信">
<INPUT TYPE=SUBMIT VALUE="取り消し">
</FORM>
EOF
$string =~ /NAME=huga¥sVALUE="(.*?)"/;
%formdata = ('huga' => $1);
print join(',', %formdata) . "¥n";
>>120 は上記を参考にして出直してください。
上記の結果が予想と一致するのであれば、スレ違いかな。
予想と違うのであれば、どっかがおかしい。
ふと思ったんだけど、 HTMLを標準出力やファイルに出力するスクリプト自体はWebProg板じゃなくてもOKよね?
124 :
120 :2006/11/08(水) 00:39:04
すみません説明不足だったのかもしれません。
簡易HTTPブラウザを作っていて、
以下のHTMLを受け取った時に解析して送信するといった処理をしたいのです。
やはりスレ違いでしょうか?
<FORM ACTION="hoge.cgi" method="POST">
<INPUT TYPE=HIDDEN NAME=huga VALUE="huge">
<INPUT TYPE=SUBMIT NAME=ok VALUE="送信">
<INPUT TYPE=SUBMIT VALUE="取り消し">
</FORM>
use LWP::UserAgent;
use
HTTP::Request::Common qw(POST);
$string = "上のHTML";
$url = '
http://hoge/hoge.cgi ';
$string =~ /NAME=huga\sVALUE="(.*?)"/;
%formdata = ('huga' => $1);
$ua = LWP::UserAgent->new;
$req = POST($url, [%formdata]);
res = $ua->request($req);
>>124 CGI/HTTPの問題であればスレ違い。
文字列のパーシングとかならOK。
で、文字列のパーシングに関しては良さそうに思う。
>>122 のコードで確認しる。
>>124 は、どこ(CGI/HTTP/文字列処理/etc.)が怪しいのか切り分けできてるのか?
126 :
120 :2006/11/08(水) 01:25:48
>>125 ありがとうございます。
>>122 の意味を掴めていませんでした。
送信、取り消しの違い(ok)をどうやって区別するかを尋ねましたが、スレ違いでした。
>>126 submitが複数あるフォームでどのsubmitが押されたかを知りたいってこと?
もしそうなら完全に板違いだね。
webprog板の初心者perlスレが良いと思う。
>>127 とっくにそのスレに移動してんだろ。
死ねよ俺www
ごめんなさい…orz
130 :
デフォルトの名無しさん :2006/11/08(水) 15:24:02
質問です ARR_1[1] =1; @ARR_2 = @ARR_1; ++$ARR_2[1]; print ($ARR_1[1]); だと当然 1が出力されます ARR_1[1][1] =1; @ARR_2 = @ARR_1; ++$ARR_2[1][1]; print ($ARR_1[1][1]); だと何故か1ではなく、$ARR_2[1][1]の値である2が表示されてしまいます どこか間違っていますでしょうか?
$ARR_1[1]と$ARR_2[1]には何が入ってるか調べる
132 :
130 :2006/11/08(水) 15:52:23
>
>>131 様
よく分かっておりませんが
上の場合は 両方とも、1というスカラー値が入っております
下の場合は、両方とも配列へのリファレンスが入っています
(なぜか$ARR_1と$ARR_2には同じ物へのリファレンスが入ってしまってます)
133 :
デフォルトの名無しさん :2006/11/08(水) 15:52:54
すみません Net::FTPのquotコマンドの引数の書き方がわからないのですが quot (CMD [,ARGS]) この場合 $ftp->quot("/usr/bin/du", "-k -s ../") これであってますか?
>>132 >(なぜか$ARR_1と$ARR_2には同じ物へのリファレンスが入ってしまってます)
リファレンスが入った配列を代入したんだから、そうなっていて正常
>++$ARR_2[1][1];
ここでは実体を変えてる
昔の友達の電話番号にかけたら違う人が出た、みたいな
136 :
130 :2006/11/08(水) 16:22:12
親切な説明、ありがとうござました 私の認識が間違っておりました ここに書いたのは省略したコードで 実際に詰まってしまった実コードはもっと複雑なスパゲティになっております 全部見直さなきゃ。
137 :
デフォルトの名無しさん :2006/11/09(木) 00:01:25
WEB検索でよく使われる構文 (A B) (C D) をSQL文 (x='%A%' or x='%B%') and (x='%C%' or x='%D%') に変換するスクリプトを簡単に書く方法はないでしょうか? Text::Balancedを使って()の対応はチェックしていますので、 ()の対応は取れているという前提でやっているのですが なかなか上手くいきません。
138 :
デフォルトの名無しさん :2006/11/09(木) 10:32:50
ファイルハンドルの渡し方で質問なんですが このようにするしかないのでしょうか? test(*OUT); sub test { local *FD = shift; flock(FD, 2); }
昨日ファイルから読み込んだデータ('機能@')&キー('@')で index ($data,$key,2)を実行したら3が返ってきたので、 "能"の第二バイト\が原因と考えそれを他の文字に置き換えたら 正しく 4 が返ってきました。 で、今日こんな場合の上手い対処方法はないか質問しようと もう一度、index ($data,$key,2)を何も手を加えずに実行したら 4が返ってきました。 indexの動作に何か環境条件が影響するんでしょうか?
140 :
139 :2006/11/09(木) 10:57:50
あ、一個書き忘れ。'機'の第二バイトは @ です
>>138 渡す方は、
open(FD, "hoge") or die;
test(*FD{IO});
または
my $fh;
open($fh, "hoge") or die;
test($fh);
受け取る方はどちらでも
sub test {
my $fh = shift;
}
ただし、perl 5.8 以降だった気がする
142 :
138 :2006/11/09(木) 13:46:55
>>142 間違っているわけではないけど、use strict できないし、古めかしい。
perl 5.6 以前のバージョンでは(記憶に間違いがなければ)、
>>138 のような
書き方をせざるを得なかったんじゃないかな。
144 :
138 :2006/11/09(木) 15:43:13
なるほどどうもです。ありがとうこざいました。
$ascii = '[\x00-\x7F]'; $twoBytes = '[\x81-\xFC][\x40-\xFC]'; $string =~ /^(?:$ascii|$twoBytes)*?(?:\Q$key\E)/; これでマッチした位置をしる方法ないですか? length $` は、0が返ってきました。 perl v5.6.1
パターンが^ではじまってるんだからマッチしたとすれば文字列先頭からなんじゃないの? ($*をいじってない限り)
147 :
145 :2006/11/09(木) 16:17:31
事故解決しますた length ($string) - length ($key) - length ($')
素直な方法は $string =~ /^(?:$ascii|$twoBytes)*?(?:\Q$key\E)/; を $string =~ /^(?:$ascii|$twoBytes)*?(\Q$key\E)/; にかえて $-[1] じゃないか。$keyの部分がキャプチャされる のがどうしても嫌なら $string =~ /^(?:$ascii|$twoBytes)*?()(?:\Q$key\E)/; でもいいがちと見難いかも。 $'はパターンマッチ使う場所がそこだけしかないような小さい プログラムならいいが、一般的にはあまりお勧めしない。
>>145 解決隅にレスるのもなんだが pos 使えば?
my $str = 'hogefugehagehoge' ;
print +( pos $str ) . "\n" while $str =~ /(hage)/g ;
150 :
145 :2006/11/09(木) 17:59:53
>>148 あっ、そっちの方が全然スマートですね。頂きます。
ところで、$' が芳しくない理由はどんなことに起因しますか?
参考サイトがあったら教えて下さい。勉強します
>>150 > ところで、$' が芳しくない理由はどんなことに起因しますか?
添付マニュアルに書いてある。
153 :
150 :2006/11/09(木) 20:12:50
>>152 いいんでね?流れ的にも pos の出番じゃなさそーだしw
っと規制解除の prin 経由でカキコテスト
かけたのはいいけどまちごーた orz... 153 は 149 です。150 さん御免。
>>152 無視が許容されているから答える人がたくさん現われるのである。
>149,153 ごめん。 pos何て使ったことないから勉強のため、それも試したんだけど、 my $str = 'hogefugehagehoge'; print +( pos $str ) . "\n" while $str =~ /(hage)/g; print $-[1]; -------------------------------- 12 8 こんな答えがでたんで、どうレスつけていいか迷って。。。。 塚、プログラムの方が忙しくて、忘れてしまったです スマソ
pos SCALAR SCALAR に対して前回に m/ /g サーチが行われた場所を返す。この関数は、最後に マッチした場所の次の文字のオフセットを返す・・。 programing Perl / 2nd Edition 改訂版 P.228 より。
>>143 open $fh, $filename が使えないんなら、use FileHandleとかすればいいんじゃね?
はじめまして v5.8.8 builtを使用しています system関数を使用して2~3個のプログラムを連続で実行させようとしているのですが 「system("Perl hoge.pl < in.txt")」 が実行できません。 誰かご教授お願いします。 「system("Perl hoge.pl in.txt")」のほうはうまくいきました 試した例 my @cmd = ('perl', 'hoge.pl', '< in.txt'); my $ret = system @cmd; my $cmd = 'perl hoge.pl < in.txt'; my $ret = system $cmd;
>>159 質問するならOSなどの環境とどう動かないか(エラーが出るとか、一見動いたように見えるが
結果がこうなるはずなのにこうなったとか)を説明しろよ。
161 :
159 :2006/11/10(金) 17:28:08
>>160 すいません。
OS: XP
my $cmd = 'perl hoge.pl < in.txt';
my $ret = system $cmd;
print $ret;
を入れたところ、「65280」という値が返ってきて、失敗しました。
my @cmd = ('perl', 'hoge.pl', '< in.txt');
my $ret = system @cmd;
print $ret;
の場合はhoge.plは実行されますが、< in.txtが引数(@argv)と勘違いされてるのか標準入力がうまくいきませんでした。(入力画面で止まる)
>>161 my $cmd = 'cmd perl hoge.pl < in.txt';
でどうかな?(試していないが)
163 :
159 :2006/11/10(金) 18:28:36
>>162 うまくいきませんでした。
my $cmd = 'cmd perl hoge.pl < in.txt';
my $ret = system ($cmd);
if ($ret != 0) {
print "error [$ret]\n";
}
で、試した所
error [65280]
となりました。
ちなみに
$ perl hoge.pl < in.txt とそのまま実行はできていますので、in.txtがない、名前を間違えてる等の間違いはないです。
>>163 幾つか試してみたけれど、そのExit codeはhoge.plの中にエラーがある場合に帰ってきてるな。
hoge.plをもっと単純な内容に変えてやってみたらどうなる?
うちの環境(ActivePerl build 819 on Windows XP)では、
hoge.plを空のスクリプトや、標準入力の内容をそのまま表示するだけの内容にして
my $cmd = 'perl hoge.pl < in.txt';
my $ret = system $cmd;
でちゃんと動いてる
>>164 色々試してくれてありがと。
hoge.plでは
print "好きな数字は?:";
$s=<STDIN>;
print "好きな数字は$s\n";
のみにしてみた。
in.txtは「1」だけ入れたけど、失敗
ちょっと。ActivePerl build 819に変えてやってみます。817だったので
167 :
159 :2006/11/10(金) 20:46:44
バージョンアップしてもダメでした…。 >PERL5SHELL環境変数に値がセットされてないか調べてみれ >それとPATHが通ってる場所に変なcmd.exeが無いかどうかも Path=C:\Program Files\MeCab\bin;C:\Perl\bin;C:\cygwin\bin; PERL5SHELLはどうやってみる&変更するんでしょうか? 教えてもらえないでしょうかお願いします。
>>167 # Perlの質問ではなくなってきてるけれど(;´Д`A
> Path=(snip);C:\cygwin\bin;
マテ、さっきプロンプトに$を使ってたがCygwin上のシェルからActivePerlを呼んでるのか。
> PERL5SHELLはどうやってみる&変更するんでしょうか?
見るには(コマンドプロンプトでもbashでも)setコマンド。
結果にPERL5SHELLが含まれてないか確認。
変更方法までは面倒見切れんので グ グ れ。
> PATHが通ってる場所に変なcmd.exeが無いかどうか
はCygwin上から使っててwhichを入れてあるなら
$ which cmd.exe
/cygdrive/c/WINDOWS/system32/cmd.exe
になっているかで確認できる。
これらが白ならいよいよ漏れには解らん。
169 :
159 :2006/11/10(金) 22:00:28
164=166=168さん 色々とありがとうございます >マテ、さっきプロンプトに$を使ってたがCygwin上のシェルからActivePerlを呼んでるのか。 いえ、Windowsのコマンドプロンプトで使っています。 cygwinのパスを通してるだけです >見るには(コマンドプロンプトでもbashでも)setコマンド。 >結果にPERL5SHELLが含まれてないか確認。 見てみますと、なかったので追加したんですが、うまく実行できませんでした ながながとありがとうございます、今度友達のパソを借りて(違う環境で)試してみたいと思います
cmd 経由でコマンドを実行するには、cmd /c ~ 後はCygwinのPerlが動いてたりとか。
Windows2000 + ActivePerlでテキスト処理などをやっているのですが、 今度から業務移管で別の担当者が行うことになりました。 で、引き継ぎをしたら「CUIだと非常に使いにくい」とか 「GUIのコマンドラッパーみたいなもの作れないの?」と言われてます。 何か簡単に実現できるよい手はないでしょうか? 自分はckw+Nyacusで満足してたのですが・・。
$ftp = Net::FTP->new の$ftpをサブルーチンに渡すにはどうすればいいでしょうか? &net($ftp); sub net { my $ftp = shift; $ftp->ls; } のようにしたのですができないようです。
Perl初心者なんですが、 変数に代入された値が数値か文字列かを 判別するにはどうすればいいんでしょうか?
多分 /\D/辺りを期待してるんだと思うけど 内部的には数値文字の区別ないよ $string = '123xx'; $num = $string + 0; print $string. " $num"; ---------------- 123xx 123
>>172 普通にできると思うけど。
そもそもサブルーチンなしなら出来ているという確認はしたの?
サブルーチンなしでも出来ない、別の問題というオチじゃ
176 :
岐山面 :2006/11/11(土) 13:33:19
>>173 残念だがPerlで文字列と数字では変数型の区別がないです。できるのは、ある文字列は有効な数字の表現かどうかだけです。たとえば、ある文字列に対するいろんな判別方法は(→Perl Cookbook)
warn "has nondigits" if /\D/;
warn "not a natural number" unless /^\d+$/; # rejects -3
warn "not an integer" unless /^-?\d+$/; # rejects +3
warn "not an integer" unless /^[+-]?\d+$/;
warn "not a decimal number" unless /^-?\d+\.?\d*$/; # rejects .2
warn "not a decimal number" unless /^-?(?:\d+(?:\.\d*)?|\.\d+)$/;
warn "not a C float"
unless /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/;
>>173 >>174 の言うとおり、内部では区別なし。
次の質問は「数値として適切な文字列を判定する方法は?」
と「値を数値と解釈したい(or そのまま文字列として解釈したい)」
が予想されるが。。。
前者の簡単な判断は $val =~ /¥D/ なら数値以外が含まれていることになる。
が、小数点や符号や浮動小数点を考慮するともう少し複雑になる。
後者は、「$val + 0」で数値として扱われる。
算術演算子で扱わなければ文字列として扱われるが、「$val . ""」で文字列として扱われる。
Math::BigRatとかつこたらええやん
Scalar::Utilのlooks_like_number使っとけ。perlの判定API呼ぶからいちばん確実
ここはモジュールのインストールについての質問をしてもOKですか?
183 :
岐山面 :2006/11/11(土) 17:01:14
モジュールのインストールなら、ActiveStateのPPMを利用すれば簡単だろう
184 :
182 :2006/11/11(土) 17:16:49
Solaris10 x86を使っていて、できれば後学のためActiveperlじゃないのでやりたいと考えていました。 DBD::mysqlについてです。
185 :
岐山面 :2006/11/11(土) 17:27:39
非PPMのインストール経験がないから分かりません-_-
>>184 基本は
$ perl Makefile.PL
$ make
$ make test
$ make install (ここは root 権限で)
なので、一度やってみ。
187 :
182 :2006/11/11(土) 18:19:05
>>186 ありがとうございます。
書いて下さった手順は一通りやっていて、make test で一つだけエラーが出ています。
t/40bindparam........FAILED test 23
Failed 1/28 tests, 96.43% okay
この状態でとりあえずインストールまでやって、MovableType3.3を動かそうとしていますが、
mt.cgiで下のようなエラーを吐いています。
Got an error: install_driver(mysql) failed: Can't load '/usr/local/lib/perl5/site_perl/5.8.7/i86pc-solaris/auto/DBD/mysql/mysql.so' \
for module DBD::mysql: ld.so.1: perl: fatal: /usr/sfw/lib/libgcc_s.so.1/libmysqlclient.so.15: Not a directory at /usr/local/lib/perl5/5.8.7/i86pc-solaris/DynaLoader.pm line 230.
at (eval 9) line 3
Compilation failed in require at (eval 9) line 3.
Perhaps a required shared library or dll isn't installed where expected
at lib/MT/ObjectDriver/DBI/mysql.pm line 96
"/usr/sfw/lib/libgcc_s.so.1/libmysqlclient.so.15"というパスは存在していない(libgcc_s.so.1はディレクトリじゃない)
ので、ここがネックなのかな、と思っていますが、どこの設定の結果ここを見に行っているのか把握できないので、
どうかご教授お願いします。
>>187 オラわかんね。
ちなみに、Solarisに二つperlが入ってるってことはないよね?
/usr/bin/perl と /usr/local/bin/perl があって、DBD のインストール対象と mt.cgi が
使ってるものが違うとか。ハズしてたらめんご。
190 :
182 :2006/11/11(土) 19:48:11
レスありがとうございます。
>>188 難しいですよね(´・ω・`)
デフォルトで入っていたものは退避させていて、新しい方を見に行くように設定しています。
>>189 わざわざありがとうございます。
しかし、書いてあるような"-static -config"ってオプションはないみたいなんですよ。
バージョン5系を使っているので、無くなっちゃったんですかね。。。
191 :
182 :2006/11/11(土) 19:56:39
libmysqlclient.soは既に/usr/libに入ってて、 LD_LIBRARY_PATHにもLDFLAGSにも/usr/libを通しているんですけどね。。。 困りました(^_^;)
>>191 問題の切り分けとして。
シンプルなテストプログラムですら動かない?
use DBI;
$dbh = DBI->connect('DBI:mysql:dbxxx:hostxxx', 'userxxx', 'passxxx');
くらいでもいいと思うけど。
194 :
182 :2006/11/11(土) 22:08:44
>>192 ありがとうございます。
libmysqlclient.so周りがあやしい、っていうのは前出のと同じ感じなんですね。
オプションの指定の仕方がハッキリとは書いてない感じなので、いろいろ試してみます。
・libmysqlclient.aを/usr/libにコピー→変わりなし
# 明示的に指定しないとダメなんですね(^_^;)
・mysql_config --libsの結果をコピーして、mysqlclient部分をlibmysqlclient.a
のフルパスに書き換え、貼り付け→オプションエラー
>>171 Perl/Tk使うとか?
あるいはWin32::GUI::Loftとか。
196 :
182 :2006/11/11(土) 23:35:48
>>193 一行目にperlパス追加したCGIにして実行しましたが、下のようになりました。
Name "main::dbh" used only once: possible typo at CGIファイルのパス line 3.
194の最後に書いた方法、ダブルクオートで囲むのを忘れていましたorz
しかし、それでやるとmake testでほぼ全滅になり、余計ダメみたいでした(;つД`)
>>196 >一行目にperlパス追加した
もしかして perl に -w オプション付けてる? だったら -w 外すか、
my $dbh = ..
にしてみて。動いてるような気がする、のはらたいらに3000点
198 :
182 :2006/11/12(日) 00:35:36
>>197 …付けてました!
外したらエラーは出なくなりました。
>>198 ということは、最低限DBに接続できていると言うことになるんじゃ?
試しにパスワードとかデタラメにしてエラーが出るように変わるか確認すればいいよね。
ということは、DBDのインストール成功(make testの影響はわからないが)。
じゃ、mt.cgi は何でよ、ってのはわからんけど。
200 :
182 :2006/11/12(日) 01:14:38
>>199 ユーザ、パスワードイジったらコネクションできなかったので何らかの形にはなってる、ってことですね。
MTのモジュールチェック用CGIでもインストールされている、という表示は出ています。
ますます原因がわからなくなってきましたね(´・ω・`)
201 :
デフォルトの名無しさん :2006/11/12(日) 01:15:55
素朴な疑問だけど、chompは何て読むの?
ちょーマジックポイント
203 :
デフォルトの名無しさん :2006/11/12(日) 01:39:38
perlってうにxのシェルのsh -xみたいなデバッグコマンドある?
Perlってなんでこんなに楽しいの?
206 :
デフォルトの名無しさん :2006/11/12(日) 08:29:10
if (($str eq 'ほげ') || ($str eq 'ふが') || ($str eq 'もが')) { print "hoge\n"; } これを簡略化して if ($str eq ('ほげ' || 'ふが' || 'もが')) { print "hoge\n"; } としたのですが、うまくいきませんでした。 簡単に書ける方法があったら教えてください。
if ($str =~ /^(ほげ|ふが|もが)$/) print "hoge\n";
ただし ほげ ふが もが にマルチバイト文字や記号が入る時は
\Q と \E で囲わないと、ダメな場合がある。
>>82-84 辺りを参照。
これはどうか print "hoge\n" if grep {$str eq $_} ('ほげ', 'ふが', 'もが')
209 :
206 :2006/11/12(日) 10:10:14
>>207 なるほどお
正規表現を使うことは全く頭にありませんでした。
ひとつ知恵が付きました。
>>208 grep関数、知らなかったので調べてみました。
これ便利ですね。
>>207-208 おかげで解決しました。
レスありがとうございました。
サブルーチンで渡しちゃうという手もあるかな。 まあ、そこまでするくらいなら普通に比較した方が楽だとは思うけど 比較文字列に何らかの修正を加える場合なら一考の余地ありかと思う。 大文字小文字を区別しないとか、半角カナ・全角カタカナ・ひらがなを区別しないとか。
>>206 解決隅にレスるのもなんだが誰も指摘しないので一応書いとく。
my $str = 'bar' ;
if ( $str eq 'fuga' || 'hoge' || 'bar' ){ print 'hoge' . "\n" ; }
211 は忘れてくれ。
214 :
デフォルトの名無しさん :2006/11/12(日) 13:34:15
ファイルのバイナリダンプから先頭32バイトを削除したいのですが、 手動でバイナリエディタから削除したものとPerlスクリプトでのものが同一になりません すみませんがアドバイスを頂けないでしょうか open (IN,"hoge"); open (OUT, ">hogehoge"); binmode IN; binmode OUT; @bin = <IN>; $binout = ""; foreach $bin(@bin){ $binout .= unpack("H*", $bin); } $bin2 = substr($binout,32); print OUT pack("H*",$bin2); close (IN); close (OUT); こんな感じでスクリプトを書いてみたのですが… ちなみに substr の所をコメントアウトして unpack したものをそのまま pack したところ 同一のファイルが出力されることは確認してます
216 :
182 :2006/11/12(日) 18:26:45
再起動して気付いたのですが、mt.cgiを、コマンドライン上では、
環境変数LD_LIBRARY_PATHに/usr/local/mysql/lib/mysql/(mysqlのインストール先ディレクトリの、ライブラリがある場所)がないと
>>193 さんのテストスクリプトも動かなくなります。
逆に、追加してあるとコマンドライン上でmt.cgiもエラーを吐かなくなります。
ブラウザ上では相変わらずなので、見に行くライブラリの指定が足りない状態でインストールされてる、ってことなんでしょうかね。。。
と、追記。この場合は単純に削除ですが 置換等の作業もするので16進ダンプを使用したいのです 最初の確認で躓き…orz
218 :
182 :2006/11/12(日) 18:36:26
すいません、
>>216 文章変でした。一行目の「mt.cgiを、」は余計です。。。
コマンドライン上だと下のような実行結果になる、ということです。
LD_LIBRARY_PATHに/usr/local/mysql/lib/mysql/がない
test.cgi => ×
mt.cgi => ×
LD_LIBRARY_PATHに/usr/local/mysql/lib/mysql/がある
test.cgi => ○
mt.cgi => ○
↓出力内容
Status: 302 Moved
Pragma: no-cache
Location:
http://設置WebサイトURL/MTのディレクトリ/mt-upgrade.cgi?__mode=install
>>218 なるほど、LD_LIBRARY_PATH の問題だったか。
じゃあ、httpd にも LD_LIBRARY_PATH を設定すれば解決するんじゃないかな。
Solarisではどのように httpd 起動してるんだっけな。
/etc/init.d/httpd あたりだっけ? そこで追記するか、そこから apachectl を
呼び出しているなら apachectl へ追記するか。で、httpd を再起動。
スレ違いになっちゃったけどね。
220 :
215 :2006/11/12(日) 20:20:29
うわー、ごめんなさい、元ファイルの抽出方法が違ったんで微妙に異なってたようです 同一の方法で抽出からやり直したところ、ちゃんと想定通りの結果になりました。 スレ汚し申し訳ない…
221 :
182 :2006/11/12(日) 22:33:06
>>219 ありがとうございます、ようやく解決できました。
やはりApacheにLD_LIBRARY_PATHを持たせる、というのでOKでした。
ApacheのconfファイルにデフォルトでLD_LIBRARY_PATHをset envするオプションがついていて、
そこに"/usr/sfw/lib/libgcc_s.so.1"が記述されていたので、libmysqlclientをそこに見に行って、
>>187 のエラーになっていたようです。
ホントにスレ違いでしたが、ありがとうございました!
222 :
デフォルトの名無しさん :2006/11/12(日) 23:57:14
ファイルを読み出すとき、改行区切りとかではなく、 ファイル全てを一つの文字列としてスカラー変数に入れたいのですが、 どう書くのが適切かつコンパクトですか。
>>222 use File::Slurp;
my $text = read_file('filename');
>>223 ありがとうございます。それ調べてみます。
ちなみに、モジュールを使わないケースではどうなりますか?
226 :
デフォルトの名無しさん :2006/11/13(月) 00:12:12
[1] { local( $/, *FH ) ; open( FH, $file ) or die "sudden flaming death\n" $text = <FH> } [2] local( *FH ) ; open( FH, $file ) or die "sudden flaming death\n" my $text = do { local( $/ ) ; <FH> } ; [3] { local( $/ ) ; open( my $fh, $file ) or die "sudden flaming death\n" $text = <$fh> } [4] open( my $fh, $file ) or die "sudden flaming death\n" my $text = do { local( $/ ) ; <$fh> } ; [5] my $text = do { local( @ARGV, $/ ) = $file ; <> } ;
227 :
222 :2006/11/13(月) 00:28:11
ありがとうございます。 と、取り敢えず安全性?なんたるものか調べます。
228 :
さくら :2006/11/13(月) 00:51:29
リナックスでperlのプログラムを実行しています。 「画面上に(kterm)に「last proxy 」と二つのメニュー(それぞれプログラム 名)を表示させ、lastをクリックして選べばlastコマンドの出力から、 自分(0123456)がログインした回数を数える(他のユーザーは数えない) サブルーチンが実行される。 またproxyを選べば、proxyのログから、ある今までにもっともサイト にアクセスした時間帯を表示するサブルーチンが実行される。」 というプログラムを組みたいのです。proxyはどんな解析がいいか、 いろいろ考え中でしたが一例として述べました。。。どなたか、アドバイス等 お願いします!!!!
230 :
デフォルトの名無しさん :2006/11/13(月) 01:29:33
Perlは肌に合わないとわかった これは完全に文系向けのものだな 厳密でない 基本的に1次元のデータが基本 列操作、多次元操作がまともにできないってどんなくそ言語だよ・・・ fortran90から移行したが それととくらべると とんでもないだめ言語だな perlは
>>230 その通りだな!! 時間の無駄だから、さっさとPerlのことは忘れた方がいい。
がんばってくれ。
>>228 アドバイスとしては、ちゃんと読み書きの勉強して、色々な本を読もうね、ってとこかな。
3つの変数のうちのどれが一番小さいかを調べたいです。 下記が今使っているコードですが、これをもっとスマートに書く方法があれば教えてください。 $number1 = 8; $number2 = 3; $number3 = 4; if (($number1 < $number2) && ($number1 < $number3)) { print "\$number1が一番小さいです。\n"; } elsif (($number2 < $number1) && ($number2 < $number3)) { print "\$number2が一番小さいです。\n"; } elsif (($number3 < $number1) && ($number3 < $number2)) { print "\$number3が一番小さいです。\n"; }
234 :
233 :2006/11/13(月) 04:49:04
すみません。 訂正します。 if (($number1 <= $number2) && ($number1 <= $number3)) { print "\$number1が一番小さいです。\n"; } elsif (($number2 <= $number1) && ($number2 <= $number3)) { print "\$number2が一番小さいです。\n"; } elsif (($number3 <= $number1) && ($number3 <= $number2)) { print "\$number3が一番小さいです。\n"; }
そうゆうのは取り敢えず配列に入れてループで比較するといいと思います。 贅沢な方法ではsortする手があります。
バブルソート最強伝説
$#value はどういう意味ですか?
>>237 配列変数 @value の最後の添え字
@value = ('a', 'b', 'c', 'd')
なら最後の要素 'd' は $value[4] なので $#value は 4 になる
アチャー>< 3 の間違いです… これは恥ずかしいw
240 :
237 :2006/11/13(月) 11:39:46
事故解決しました。 >$#変数名 は、@変数名 の配列の最後の添え字(個数から1をひいたもの)を表わします。
$#valueは要素数を返す方が直感的
スカラコンテキストなら @value って書けば要素数になるんだからよくね? $#value はあくまでも最後の添え字として扱うべきで、 $#value + 1 を要素数として使うべきではないって偉い人が本に書いてた。
……
ま、添字の初期値を変更する変質者もいるかもしれんし。
>>234 >>235 のゆうように比較対象を配列にいれて、
勝ち抜き合戦を一回ループすればおk
最小値を求めるのも同じ。
ソートはまた別の話だから混乱しないように。
パールっつよりプログラミングの基本テクニック
だから、どこにでも参考資料はあると思うよ
Scalar::Utilのmax,minが単に最大値、最小値求めるだけじゃなくて ブロック引数を与えたらブロックの値を最大or最小にする要素を 返してくれれば便利なのになといつも思う。 min { $x[$_] } 0..$#x みたいに使うイメージで。
ごめん、ぼけてた。ScalarじゃなくてList::Util
min @x[0..$#x]; それぐらいならこれでいいじゃん
>>249 添え字が欲しいんじゃなかったっけ? それだと値のほうになってしまうよ。
reduce { $x[$a] < $x[$b]? $a: $b } 0..$#x
でもいいんだけど$aだの$bだの何度も書くの面倒だし。
あーなるほど。
@x[0..$#x]は配列スライスを使うまでもなく@xでいいのでここは笑うところだったのかもしれず
perlにはINT_MAXとかDBL_MAXみたいな 処理可能な数値の最大最小を表す定数なり 特殊変数はないん?
255 :
デフォルトの名無しさん :2006/11/13(月) 15:47:36
/* | | | ∧|∧ ( / ⌒ヽ | ̄ ̄ ̄ ̄ ̄ ̄ ̄ | | | | ∪ / ノ . | ノ ノ ノ */ main ( ) { }
256 :
253 :2006/11/13(月) 16:12:04
257 :
デフォルトの名無しさん :2006/11/13(月) 20:12:16
みんなきちんとパールの話題したいんですか?って疑問におもう。。。
Linux上で日本語のファイルをperlで処理したいですが普通にできますか?
259 :
デフォルトの名無しさん :2006/11/13(月) 22:19:48
独習終えたら何を読むといいですかね?
260 :
デフォルトの名無しさん :2006/11/13(月) 22:51:09
261 :
デフォルトの名無しさん :2006/11/13(月) 22:51:33
でらべっぴん はオススメ
262 :
デフォルトの名無しさん :2006/11/14(火) 02:23:45
>>260 ありがとうございます。
hashのkeyに半角の空白を含む日本語を入れてvalueに数値を入れると
Argument "ホゲホゲ 5" is not numeric in array element at ./a.pl, <> line 28
の用にエラーが出ます。
何がいけないのでしょうか?
>>259 > 独習終えたら何を読むといいですかね?
主要モジュールや最近バリバリ書かれているとんがったシステムのソースコード。
>>262 > hashのkeyに半角の空白を含む日本語を入れてvalueに数値を入れると
ホントか? ホントにそう書いてあるか?
265 :
デフォルトの名無しさん :2006/11/14(火) 02:54:07
>>264 hashに 「ホゲホゲ 5」 をいれて
keyに 「10」 を入れた時に以下のエラーが出ます。
日本語の取り扱いが間違ってるのでしょうか?
Argument "M-^CzM-^CQM-^CzM-^CQ 5" isn't numeric in array element at ./a.pl line 32, <> line 1.
とりあえずエラーが出た行あたりのプログラムさらしてもらったほうがいいと思うけどな。
267 :
265 :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; }
268 :
265 :2006/11/14(火) 03:18:44
>>267 間違い。
簡略化したのでエラーが出るのは最後の行です。
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];
}
だからさ、 Argument "M-^CzM-^CQM-^CzM-^CQ 5" isn't numeric in array element at ./a.pl line 32, <> line 1. って、配列の添字に数値じゃないのが入れられてるっていうエラーなんだが。
>>268 答えを言うのはもったいないので、とりあえず use strict してみようよ。
271 :
265 :2006/11/14(火) 03:28:11
>>269 hashには数値以外も入れられるんじゃないのでしたっけ?
>>271 あなたのコードには、hashは存在しません。
273 :
265 :2006/11/14(火) 03:32:54
>>272 わかりました!
ありがとうございます。
なにこの面白い流れw 答え言っちゃダメでしょw
>>274 全員が君みたいな性格って訳じゃないみたいだ
argvのvってなんですか?
ふむ、Argument Vectorだな。
279 :
デフォルトの名無しさん :2006/11/14(火) 10:15:56
なるほど。 ありがとう
280 :
デフォルトの名無しさん :2006/11/14(火) 11:25:40
perl使いの性格が良くわかるやりとりでした
281 :
デフォルトの名無しさん :2006/11/14(火) 11:27:32
print <<END_OF_DATA; の中に use constant LOG_DIR => './logs'; などの LOG_DIR や 関数呼び出しを書くことは可能ですか?
foreach my $value (@log) { if ($flag) { undef $value; } } ってやると @log から $valueの要素が削除されるのって仕様なの?
>>282 削除されたんじゃなくて値が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.
↑ごめん引用元書き忘れた。perlsyn(1)です。
285 :
282 :2006/11/14(火) 13:47:38
でも $value = ""; ってやっても消えないよね どうなってんの
287 :
282 :2006/11/14(火) 14:11:10
え@logの要素にも空文字列が入るの?
関数の引数@_みたいにただのエイリアスなんだね。
289 :
282 :2006/11/14(火) 14:54:41
まじなのかよこえー
291 :
デフォルトの名無しさん :2006/11/14(火) 15:02:17
▓ ▓. ▓█ ▓█ ▓▓██ ▓▓██ ▓▓▓▓▓▓▓▓▓▓▓███ ▓▓▓██▓▓▓▓▓██▓▓███ ▓▓█▓▓▓▓▓▓▓▓▓█▓███ ▓▓▓▓█▓▓▓▓▓█▓▓▓███ ▓▓▓▓▓█████▓▓▓▓███ ▓▓▓▓▓███▓▓▓▓███ ▓▓▓▓▓▓▓▓▓███ ▓▓▓▓▓▓▓▓▓▓▓▓███ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓███ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓███ これを見ると今年の大学受験に落ちます。 これを今から1時間以内に3回他スレにコピペすれば100%、受かります。 貼らないと 落 ち ま す
>>281 できない。できたらかえって困る。here document なんだから。
ただ、$hoge のように「$」から始まっていれば変数置換は評価される。
しかし、$hoge がオブジェクトだったとしても
$hoge->method() としても method() は呼び出されない。
>>276 >argvのv
釣りにマジレスで Volume。
>>281 ↓実験してみ。
sub sum { $_[0] + $_[1] }
use constant THREE => 3;
print <<_EOF_;
${[sum(THREE,4)]}[0]
_EOF_
>>294 独創的だな。
普通は @{[ expr ]} か ${\( expr )} だと思うが。
print __FILE__ . ":" . __LINE__ .":"; を書くのが面倒なのですが、Cのプリプロセッサのようなことは できないのでしょうか?
windowsXP+Activeperl(v5.8.8)でImage::Magickをインストールしようとして cpanのshellでinstall Image::Magickと入力するとnmakeが実行されるのですが windows.hが開けないと言われて終了してしまいます vc++のインクルードディレクトリにはちゃんとwindows.hのあるディレクトリが指定してあり vc++のプロジェクトでは普通にwindows.hをincludeすることができます どうすればインストールできるのでしょうか
298 :
デフォルトの名無しさん :2006/11/14(火) 21:14:32
Perlで例外処理をする方法としてError.pmを使うというのまでは 分かったのですが、Error.pmのエレガントな使い方について 教えてもらえませんか?
>>297 駄目な理由は、 lib/config_heavy.pl 参照。
自力でコンパイルする時は、perl自体もソースからコンパイルして生成するか
lib/config_heavy.pl と lib/config.pm を適切に修正する必要があるよ。
ActivePerlならppmを使う方法が楽。
自分は Image Magickのwin32パッケージに入ってる奴を入れた。
方法は Image MagickのREADME.TXTに書かれてる。
>>296 プリプロセッサ相当のことならばFilterモジュールがそれだが…
"Thare's more than one way to do it."
sub __HERE__() {
my (undef, $filename, $line) = caller();
return "$filename:$line:";
}
print __HERE__;
301 :
297 :2006/11/14(火) 22:16:49
>>299 ありがとうございます
ppm使ってやってみようと思います
>>300 caller()で十分でした。ありがとうございます。
open(IN, "< test.txt"); flock(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を指定せずにできる方法はありませんか。
open, IN, '<:raw', test.txt or die "$!\n";
間違えた。 open OUT, '>:raw', 'test.txt' or die "$!\n"; flockも数字リテラルよりもFcntl.pmを使うのがお薦め。
306 :
デフォルトの名無しさん :2006/11/15(水) 05:05:31
私はPerlはCGIとしてWebベースで動くものしか作ったことが無い者ですが教えてください。 Windows+ActivePerl5.8の環境で、Windows標準の時計(時刻)をPerlで変更することってできますか?
できる
>>306 それは、Perlじゃなくて、その、なんていうの、そうゆうのは時計のほうを調べるんだよ。
309 :
デフォルトの名無しさん :2006/11/15(水) 10:15:47
use constant THREE => 3; で &test(THREE);ってかくとエラーなんですけどなんでですか? それと自作関数に&付ける人といない人がいますけど違いってあるの?
>>309 エラーメッセージはインタプリタが人間に分かるように適切に出す大事な情報なんだよ。
おまえの説明はソースとエラーメッセージを省略してるからエスパーしか状況を把握できんぞ。
助けを求めるときには、おまえではなく他人に分かるように状況を説明しろ。
>>309 どこでどのようなエラーが出るのか、省略せずに全部書け。
サブルーチン呼出しで & を付ける必要があるのはそれがサブルーチン名だと
判別できない場合、つまり後ろの () がない状態で使う場合だ。
313 :
309 :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 になってるんですが置き換えできないのでしょうか?
>>313 サブルーチンの引数とrequireではかなり話が違う。
reqruire PL;
だとrequireに対してベアワードが引数だったときに'.pm'をつけてファイルを探す機能の
方が先に効いてしまうので
reqruire (PL);
などとすればよい。
315 :
309 :2006/11/15(水) 13:01:37
できました。ありがとうこざいます。
,, ―- 、_ / '' - ,, / '' - ,, / ヽ i / /ヽ ! ,i ./ / ''―、 ! i ,、 n て'' ノノ ヾ ! i ノノノ ノ ノ ''´ ! / ¦ j ' ´ ノ ( ヽ | >-,, / ,,=━━・!' ,ノ━== ! ノ !・ ヽ | ’ニンniii、 :::::i/ィ7iii= i ) \(てi iヽ ^' ~ -' /} `i_ 、 \ i_ l_j `┐ i /(,,, ,n 〉 /\\ もうスクリプトっていうレベルじゃねぇぞ!  ̄ ̄へ ! ' T'' l | \ | ! i ン=ェェi) i ソ ) | i´\! ,, -ェ`、_ン ノノ 〈 | | \\,, `―''´// | | つ !、_''''''''''''' / 7
>>312 の解説をより正確にすると以下のようになります。参考までに。
サブルーチン呼出しよりも定義が先に perl に読まれる場合は () と & を省略可能。
サブルーチン呼出しよりも定義が後に perl に読まれる場合は () か & のいずれかが必要。
いずれの場合でも () または &、もしくはその両方を記述する事ができます。
いずれの場合でも & を付けるとプロトタイプ宣言を無視します。
& って付けるメリットあるの? リファレンス取るときぐらいしか付けないなぁ。
$string = <<HOGE value1<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 とうまくいきます。なぜですか?
>>318 &をつけることによってプロトタイプを無視できる。
プロトタイプ無視して何がうれしいのかという疑問が...
322 :
317 :2006/11/15(水) 23:51:42
>>318 最大のメリットは定義済か未定義かに加えて、言語組込の予約語との名前衝突を気にしなくてよくなる点ですが、
>>317 では意図的に省いています。
でもこれはメリットかどうか微妙というかなんというか…、「やりたければそうすることもできるよ」という「Perl 流」(というよりも UNIX 流) の一例とは言えるでしょう。
常に付けておけば、マイナーな予約語との衝突によるややこしいエラーと格闘せずに済むという点ではメリットかもしれません。
>>319 $string =~ m{value1<TD>(.*?)<TD>value2<TD>(.*?)</TR>[\r\n]*<TD>ほげ<TD>(.*?)<TD>};
素直に改行をマッチさせるんじゃダメなん?
>>322 予約語との衝突を防ぐのと、プロトタイプチェックされるのとでは、断然後者のほうが有益なような…
それに、衝突のチェックは、例えば構文色分けできるエディタで予約語を色分けすれば防げるよね。
まあ、個人の主観の問題なので、TMTOWTDIってことで……。
324 :
319 :2006/11/16(木) 00:18:00
>>323 なぜ\565を削除するしないで結果が変わるのか知りたいです。
>>324 なんだか面白い現象だね
>>319 。
ぼくもよくわからんけど、さしあたり /\\\d\d\d?/ のような文字列が八進表現の文字コードによる文字指定として展開される点については知っていますか?
>>318 あと、歴史的な理由もなかったかな。
perl4 とか 3の頃では、自作サブルーチンの呼び出しに&は必須だったような記憶が。
>>324 >>325 の書いてる通り \565 は1つの文字として扱われてるんだけど、
Perl では文字列中に ASCII の範囲で表せない文字(255番以降の文字)が入ってると
UTF-8 の文字列として扱われる。(正確には UTF-8 をPerl独自に拡張した「utf8」)
この時、同じ文字列中にある「ほげ」も UTF-8 に変換されるけど、
その結果、正規表現中の(ファイルのエンコーディングでの)「ほげ」という文字の並びと
変換された「ほげ」が一致しなくなるので、マッチしなくなってしまう。
(しかも、\565 なんてわけがわからない文字と一緒だから、誤変換されてるっぽい)
これを防ぐには、スクリプトファイル自体を UTF-8 エンコーディングで保存して、
頭に use utf8; を付ければよい。文字列もパターンも全てUTF-8で統一されてハッピー。
>>324 \565 がiso-8859-2(latin2 , 1文字=1バイト)で表現できない文字だから。
なので、$stringはutf8化されて格納される。
正規表現もiso-8859-2扱いだが、正規検索エンジンがutf8化を考慮しないので、
(utf8の仕様上)ASCII範囲外の文字がマッチしなくなる。
329 :
319 :2006/11/16(木) 07:26:41
>>325 ,327-328
なるほど。
そういうわけだったんですか。
では\565を消さずともほげの前に<TD>を追加するとマッチするのはなぜなんでしょうか?
<TD>に特別な意味はないのであるなしにかかわらず$stringはutf8として扱われ、結果マッチしないと思うのですが。
330 :
309 :2006/11/16(木) 10:31:24
use 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. これはなぜなのでしょうか? 複数の定数を定義するとこうなるのですが
331 :
デフォルトの名無しさん :2006/11/16(木) 11:12:38
while (<DATA>) { $file{$num} = [(split)[2..4]]; この場合、splitは何を表しているのでしょうか?
>>330 use constant {STR => 't', FLAG_X => 1};
>>330 それ複数の定数の定義になってないし。perldoc constantよく読め。
× use constant (STR => 't', FLAG_X => 1);
○ use constant {STR => 't', FLAG_X => 1};
ちなみに上も便宜上×と書いたがそれはそれで正しい書き方で、
('t', 'FLAG_X', 1)というリストを値とする定数STRを定義したことになる。
>>331 $_ = "aa bb cc dd ee";
$a = [(split)[2..4]];
print join(",", @{$a}) . "¥n";
-----
cc,dd,ee
>>331 すべての引数を省略して組み込み関数splitを呼んでるだけ。
引数省略したときどういう意味になるかはマニュアル読め。
336 :
330 :2006/11/16(木) 15:36:41
ありがとうこざいました。
Perlのオブジェクト指向使いづらっ
OOPは後から取って付けたものだからねえ。 言語はケースバイケースで使い分けられるのがよろし。
どの辺が使いにくいと思ったかも書けよ。
そんな自明のことは書かなくていい
そこまでいうとOOP使いづらいのも自明じゃないか...
ぶっちゃけ慣れの問題だろ
343 :
328 :2006/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文字セットに含まれる)
事が、正しくマッチが行われる為の条件になっている。
344 :
デフォルトの名無しさん :2006/11/17(金) 11:06:23
$data{$moji} = [ $num1, $num2 ]; これはどのような動きをしているんでしょうか? 変数名は気にせずに。
346 :
デフォルトの名無しさん :2006/11/17(金) 11:19:33
>>345 とはいっても、mojiに代入できるのは1つでは?
>>344 ハッシュdataのキー$mojiの値を、リスト($num1, $num2)へのリファレンスにしている。
348 :
デフォルトの名無しさん :2006/11/17(金) 11:22:17
>>347 key value
moji → num1
moji → num2
ということでしょうか?
data{key}をプリントすれば
num1 と num2が表示されるということでしょうか?
プリントしてみなよ perl リファレンス でぐぐるといいかも
350 :
デフォルトの名無しさん :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 何かよくわからない結果になってしまったのですが・・・
それがリファレンスです
353 :
デフォルトの名無しさん :2006/11/17(金) 11:44:04
デバッグってどうするんですか?
「リファレンス」って言葉が何回も出てるし 「perl リファレンス でぐぐるといいかも」ともあるだろ
355 :
デフォルトの名無しさん :2006/11/17(金) 11:48:43
少なくとも結果はでてます
356 :
デフォルトの名無しさん :2006/11/17(金) 11:54:33
なんすかー わからないなら知ったかしないでください
>>353 どこが間違っているか調べて、それを修正して正しくする。
ここで説明するより、解説してるサイトや本を見てもらったほうが早い ひと通り見た上でわからない点があれば質問するといいよ
359 :
デフォルトの名無しさん :2006/11/17(金) 12:41:39
のってない
perl リファレンス 無名配列 ぐぐって1ページ目の全サイトを1日かけて読め
363 :
デフォルトの名無しさん :2006/11/17(金) 12:55:48
1日もかけたらこのスレの意味がない
print $data{$moji}->[0]; print $data{$moji}->[1]; これでわかっただろ。
以下放置で。
366 :
デフォルトの名無しさん :2006/11/17(金) 13:37:28
367 :
デフォルトの名無しさん :2006/11/17(金) 13:49:20
age
ここは学校でもなんでもないのです。 一から手取り足取り教えてくれるわけないのです。 それくらい初歩的で、調べればいくらでも答えの出てくる質問なのです。 自分に調べる能力がないからって駄々こねて暴れても無駄です。
369 :
デフォルトの名無しさん :2006/11/17(金) 15:25:55
このままできない様なら Perl6バージョンアップボタンを押からな
370 :
デフォルトの名無しさん :2006/11/17(金) 18:40:32
for (sort {$file{$a}[1] <=> $file{$b}[1]} @keys) { for $box (@{$data{$_}}) { } すみません、これはどういうことを表しているのでしょうか?
>>370 リスト@keysの要素をハッシュ%fileのキーにしたときの値のリストの2個目(1番目)の要素によってリスト@keysを昇順にソートし、
ソートされた各値をハッシュ%dataのキーにしたときの値の文字列を名前とするリストの各要素を変数$boxに入れて繰り返すことを
ソートされた@keysの要素でくりかえす
ってことかな。
372 :
デフォルトの名無しさん :2006/11/17(金) 20:20:35
keys = ai bi ci di ei とすると file[ai][1] <=> [][2] ん、これは aiとbiを比較してから 昇順にソートして for $boxの行を実行するのか それともai からeiを全てが 昇順になるようにその行でソートしてから for $boxの行を実行するのでしょうか?
374 :
デフォルトの名無しさん :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 とまで全て比較しているのでしょうか?
376 :
159 :2006/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); にするしかないんでしょうか?もっとうまい具合の方法があったら教えてください
376の名前である159の意味はないです。 申し訳ありません
>>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;
の方が多少マシだと思う。
質の良い乱数が必要ならば専用のモジュールをあたるべき。
randが返した値サンプル10個 0.56646728515625 0.523223876953125 0.143218994140625 0.589141845703125 0.5029296875 0.998626708984375 0.325347900390625 0.82904052734375 0.5904541015625 0.816375732421875 これらに65536を掛けると全て偶数でかつ整数 どゆううこと?
\8000などから\を削除したいのですが逆chonp関数みたいなものってありますか?
s/^.// とか
>>381-382 ありがとうございます。
解決しました。
# substrってs///で代用出来る思うんですが、何かメリットあるんでしょうか?
# chompってs///で代用出来る思うんですが、何かメリットあるんでしょうか?
385 :
デフォルトの名無しさん :2006/11/18(土) 11:58:32
# なるほど
386 :
デフォルトの名無しさん :2006/11/18(土) 13:21:50
#println関数みたいなのって無いの?
自分で作ればいいじゃない
>>387 > 自分で作ればいいじゃない
ワンライナーなときに欲しいよね。
>>389 perl -le 'print "hage"'
このスレは本当に勉強になります。 ところで、OOP勉強として、モジュールの中身を覗いているのですが、 意外と複雑な物が多いです。初心者が読めるくらいの単純なモジュールのお勧めはないですか? (レファレンス、パッケージ、オブジェクトの概念はわかります) 「ああ、こういう風に実装してるのか」という実感がつかみたいのです。 perlの勉強で、一番始めにソースを読んでみたモジュールを教えてくださっても構いません。
Class::Data::Inheritableマジお勧め。 短いのにいろいろ勉強になるテクニック満載
Catalyst 嫁
Plagger詠め
お助けください。 変数名に変数を使いたいたく、いろいろ試してみたのですがどうもうまくいきません。 $abc="file"として、$iを0,1,2,3,4・・・と増やしたいのです。 $abc$i ${abc"$i"} ${"abc" . "$i"} など試してみましたが、だめでした。 なにかよい方法ないでしょうか?
396 :
デフォルトの名無しさん :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.
397 :
デフォルトの名無しさん :2006/11/19(日) 00:27:13
欲しい関数を仮に jsplit() とすると、こんなイメージです。 $tmp = "我輩はネコである"; @words = jsplit($tmp); foreach $word (@words) { print $word,"\n"; } 出力結果: 我輩 は ネコ で ある。
>395 日本語で書いてくれ。 >396 日本語の分かち書きだな。Text::ChasenかText::MeCabあたりかな。
401 :
396 :2006/11/19(日) 01:49:21
402 :
395 :2006/11/19(日) 02:55:59
>>399 >>400 ありがとうございます。
無事にできました。
use strict;
を使ってたらエラーが出ましたが、はずしたらうまく動きました。
>>402 何に使うか知らんが、配列にしたらええやん。
404 :
391 :2006/11/19(日) 10:45:48
405 :
デフォルトの名無しさん :2006/11/19(日) 11:21:31
正規表現で日本語(S-JIS)を使うと [ が入ってるとエラーが出るのですが 皆さんどうやって回避してますか?(たとえば「ー」があると言われる) 文字コードを変換してるのでしょうか?
406 :
デフォルトの名無しさん :2006/11/19(日) 11:29:16
普通はutf8かeucに変換してから扱うと思うんだ
入出力時に変換してスクリプトと内部処理はutf8に統一
\Q\E とか use encoding とか
409 :
デフォルトの名無しさん :2006/11/19(日) 12:32:03
皆さんどうやって変換してますか? Jcode->convert() Jcode->new()->euc で変換するのはおk?
板違いだが、ケータイの絵文字なんかが入力される環境だと文字コード変換しにくいんだよな……。
>>410 そのあたりを扱うフレームワークが作られていたと思ったが。
Encode::JP::Mobile
ほー。 今度、仕事先に導入してみない?って聞いてくる。
このレスでのコメントを読むと大変に勉強になります。 大学などでは、Javaなどの言語の講義はあると思いますが、 Perlは高等教育、情報科学教育では嫌われている言語ので、 授業などで学ぶ機会は少ないと思います。 perlに詳しい方は、どのような勉強法をされましたか? 皆さん独学ですか?
習うより慣れよ。 ことプログラミングに関しては、他人に習うということは忘れた方が良い。
416 :
デフォルトの名無しさん :2006/11/19(日) 15:29:28
Perl には詳しくない。独学。 いまだに sprintf() を使ってしまう。 printf( "%d\n" $hogehoge); と書く癖が抜けない。
ソースコードを読もう。
計算機言語の講義なんてナンセンス。 自分で習得しやがらない阿呆ための救済策だ。
言語の習得は目的ではない。手段だ。
情報系の学科を修了した人は、高卒に見えてしまう。
どのルート辿ろうが 勉強し続けなきゃろくなことできないからな
>>414 情報系の大学では、言語の講義なんておまけだよ。
もう書いている人がいるように、尻拭い的。
423 :
デフォルトの名無しさん :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番めですか?
以下のような感じで$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;
426 :
デフォルトの名無しさん :2006/11/19(日) 18:44:15
>>425 myはグローバル変数ではなくレキシカル変数の宣言だよ。
グローバル変数の宣言はourを使え。
詳細は
perldoc -f my
perldoc -f our
>>425 どう見ても$FOOをファイルconfig.pl内にローカル化しています。
429 :
デフォルトの名無しさん :2006/11/19(日) 18:58:10
for data (@datas){ これってどういう意味なのでしょうか? for文ではありえない気がするのですが
ありえないだろうな 普通 for $data (@datas) {} だし、 それ以前にdataの複数形ってなんだ @datasの要素を1つずつ$dataに代入し、ブロックを実行します foreach $data (@datas) {} と等価です
data自体が複数だよ。単数形はdatum
>>431 ( ・∀・)つ〃∩ ヘェーヘェーヘェー
>>414 特定言語の講義なんてなかったよ?
具体的な実装例としてオマケ的には使うけど。
>>427 ourにしてみましたが同じエラーになります。
>>428 >どう見ても$FOOをファイルconfig.pl内にローカル化しています。
具体的にはどのようにすればいいでしょうか?
>>434 427はレキシカル変数とグローバル変数は違うよって説明でしょ。
perldoc読んでないでしょ?
エラーをなくしたいのであれば
test.plのrequireをBEGINで囲って、
config.plのグローバル変数はourじゃなくてuse vars使って定義してみ。
そもそもグローバル変数を使おうって考えがいけないのじゃないだろうか。
つ~か、AppConfigでも使うってのはだめか?
438 :
デフォルトの名無しさん :2006/11/20(月) 01:49:59
質問させてください。 windowsのperlで、wavかmp3のサウンドを鳴らせる方法はあるでしょうか? もしあれば、ご教授よろしくお願いします。
>438 つWin32::Sound
>>433 ないよね。 言語使ったとしてもそれは素材的な
使用をしてるだけで、本則は基礎理論だし。
基礎が有れば言語が変わったって、数週で対応できるよ。
例えれば、乗る車が変わるのと大差ない。
基本操作知ってれば、あとは車幅感覚や視点高さに慣れるだけ。
>441 良い例えだな。免許持ってないけど。
>>434 Exporter使ってuseでimportできるようにするのが吉。
質問があります。 if文の条件式はどう書けばいいでしょうか。 @array = (3, 5, 9, 10); for (my $i =0; $i <= 20; $i++) { if () { # $iが@arrayに含まれている時の処理 } else { # $iが@arrayに含まれていない時の処理 } }
grep($_==$i, @array)
>>444 チェック用のハッシュを作る
for (@array){$Hash{$_} = 1};
for (my $i =0; $i <= 20; $i++) {
if ($Hash{$i} == 1){
・・・
SJIS全角文字をn文字以上を含んでいるかチェックさせたいのですが 書き方がわかりません。 /[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]\{2,\}/ これじゃだめですよね。 他にも色々試してみたのですがさっぱりわからないので どなたかご教授ください。
駆け出しですが,こんなのできました. #! /usr/pink/perl -w use strict; my @array = (3, 5, 9, 10); { foreach (1..20) { if ($array[0] == $_) { print "Match: $_\n"; } } shift @array; redo if @array; }
450 :
448 :2006/11/20(月) 21:55:48
すみません、これで自己解決しました。 /[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]\{2,\}/ ↓ /([\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]){5,}/
>>449 普通のブロックにredo使ってるの久々に見たなぁ。redo自体あんま見ないけど。
ただ、破壊してるうえに可読性も悪くなった割には、2重forでぶん回すのと変わってないような。
数が少ないうちはいいけれども、多くなってきたり、重複してきたりするとややこしくなってきたり。 やっぱりハシュ使った方が効率的かなぁと。@2ch回路的経験 my %hash; @hash{@Array} = (1) x @Array; みたいな。。
>@hash{@Array} = (1) x @Array; これ何やってるの?
二項演算子の "x" は繰り返し演算子です。 スカラコンテキスト
では、左被演算子を右被演算子に示す数だけ繰り返したもので構成
される文字列を返します。 リストコンテキストでは、左被演算子
が括弧で括られたリストであれば、リストを繰り返します。
print '-' x 80; # 1 列のダッシュを印字
print "\t" x ($tab/8), ' ' x ($tab%8); # タブに畳み込み
@ones = (1) x 80; # 80 個の 1 を含むリスト
@ones = (5) x @ones; # すべての要素を 5 にする
ttp://www.att.or.jp/perl/man/perlop.1.html より
>>451 , 452
評価してくれてありがとう!光栄です.
また暇だったら,たまーーーにROMらせてもらいます 笑
(2ch鯖監視係。の中の人 乙華麗!)
(´-`).。oO(shebangの /usr/→pink←/perl が気になったりして♪)
459 :
デフォルトの名無しさん :2006/11/21(火) 05:59:32
こうやると、配列の代入部分で処理コストが掛かって Rubyで書いたスクリプトより遅くなるんですが、どうにかなりませんか? @a = sort(@a); sort(@a); それとも、とすると、すでに何かの変数に代入されてますか?
>>459 配列代入のコストとソートのコストをどうやって分離して計測したんだ?
>>459 そういう質問する場合は
・環境
・比較したRubyとPerlのソース
・計測方法
・計測結果
ぐらい出せや。
462 :
デフォルトの名無しさん :2006/11/21(火) 14:25:57
2chみたいにIDが日付で変わるようにしたいんですけど それでIPと日付を暗号化したものが掲示板に表示されるようにしたいんだけど cryptで暗号可したんですが 半角10文字までの文字だけが暗号可されるみたいで IPの最初のほうがいっしょのやつはIDがいっしょになって困ってます。 教えてください
463 :
デフォルトの名無しさん :2006/11/21(火) 14:28:36
日付2桁、IP8桁でやればいいんじゃないか?
464 :
デフォルトの名無しさん :2006/11/21(火) 14:32:52
465 :
デフォルトの名無しさん :2006/11/21(火) 14:33:51
466 :
デフォルトの名無しさん :2006/11/21(火) 15:02:37
468 :
デフォルトの名無しさん :2006/11/21(火) 15:40:09
469 :
デフォルトの名無しさん :2006/11/21(火) 15:57:10
>>460-461 すみません。具体的には以下のような感じです。処理結果は10回の結果の平均値です。
単純な計測方法なので誤差はあると思いますが…
配列の代入なしで実行した場合はPerlの方が圧倒的に速いのですが
代入処理を入れると一気に遅くなってしまいます…
[環境]
OS: WindowsXP SP2 CPU: Pentium4 2GHz RAM: 1GB
Perl ver: 5.8.3.809 Ruby ver: 1.8.5
[結果]
Perl: 0.078sec (代入なし) 1.391sec (代入あり)
Ruby: 0.219sec
[ソース]
----- Perl -----
$N = 100000;
$s = (times)[0];
srand(time());
@a;
for($i = 0; $i < $N; ++$i){ $a[$i] = rand($N); }
@a = sort(@a); #代入あり
#sort(@a); #代入なし
print((times)[0] - $s);
----- Ruby -----
N = 100000
s = Time.now
srand(Time.now.to_i)
a = []
N.times{ a << rand(N) }
a.sort!
print Time.now - s
>>469 馬鹿者。
数値のソートは @a = sort @a じゃなくて @a = sort {$a <=> $b} @a だ。
perlに無駄な仕事させてんじゃねぇ。
無駄な仕事ってのは、@aの各要素に対する文字列値の生成の事な。
内部で100000回のsprintfとその倍のmalloc(OSレベル)が発生するので遅くもなるが、
そもそも文字列比較と数値比較では結果が異なる。
471 :
461 :2006/11/21(火) 16:50:59
>>469 > @a = sort @a
を
my @result;
@result = sort @a;
に変更してみ。
確か古いバージョンのsortはソート対象の配列と
結果受け取りの配列が同じだと極端にパフォーマンスが落ちるってのがあったと思う。
あと演算子を指定しないとデフォルトでは文字列比較になるから
数値比較する場合は
@result = sort {$a <=> $b} @a;
ってしないとソート結果がおかしくなるぞ。
コマンドプロンプト起動して
perldoc -f sort
でsort関数のマニュアルがでるからそれ見れ
ソートだけの時間計ってみたら代入なしのときは0だったから 代入なしのソートって何もしてないんじゃね?
473 :
461 :2006/11/21(火) 17:12:20
Rubyのコードでは、配列に入っているのが整数だという不公平性もあるので 同じにはならんだろうな。
475 :
デフォルトの名無しさん :2006/11/21(火) 17:29:27
>>470-471 レスどうも。言われた通りのコードで実行してみました。
処理速度が倍くらいにアップしましたが、まだ「0.687sec」なのでRubyより遅いです…
やはり配列のコピーの部分がネックになってる様なのですが…
my @r;
@r = sort{$a <=> $b} @a;
ちなみにRubyは配列を代入しても「!」を付けた破壊的メソッド(メソッドの内部で値入れ替え)でも
速度は殆ど変わりませんでした。代入がすべて参照になってるからみたいです。
476 :
469 :2006/11/21(火) 17:35:29
>>474 あ、言うのを忘れてましたが、新しいコードでは乱数生成の部分は、
int(rand($N));
で行いました。こうすると浮動小数の時より少し速くなりました。
新しいコードは以下です。
$N = 100000;
$s = (times)[0];
srand(time());
@a;
for($i = 0; $i < $N; ++$i){ $a[$i] = int(rand($N)); }
my @r;
@r = sort{$a <=> $b} @a;
print((times)[0] - $s);
RDBMを使うようになってからというもの、sortなんてめったに使わなくなってしまった…。 まぁ代入でRubyより時間が掛かるのは、そりゃそうだろうな。それは仕方ない。 その代わり他の部分で早かったりもするし、スクリプト言語なんてそんなもんさ。
478 :
デフォルトの名無しさん :2006/11/21(火) 17:40:40
ちなみにPerlもRubyもsrand()をする必要はないぞ。
確定情報じゃない( ruby の方 )からロムってたんだが。 - ruby のソートはクイックソート(多分、間違ってたら指摘よろ) - perl のソートは ( perldoc -f sort / perldoc sort に書いてある。確定) - 5.6 以前は quick sort - 5.8 以降は mergesort アルゴリズムが違う可能性があるんだよ。 そこまで速度に固執する理由が判らんが、 use sort '_quicksort' ; 宣言して sort { $a <=> $b } @a あたりしてみたら如何?
ところがPerlでは実装部分では整数が
481 :
462 :2006/11/21(火) 17:43:53
md5のやりかたがのってるサイトああればよかったら教えてください 検索したのですが 出てきませんでした
483 :
462 :2006/11/21(火) 17:45:58
>>482 あ、標準モジュールか。
まあ、Digest::MD5を使えと。
485 :
469 :2006/11/21(火) 17:49:41
>>479 0.656sec と変わりませんでした。
やはり一番のネックは代入の部分みたいです。これは言語の特徴という事で仕方がないかもしれません。
代入処理を省略すると、0.084sec と一気に速度アップするみたいですので。
>>485 それ、早い遅い以前にソート処理が処理がスキップされているぞ。
代入の速度を計りたいなら
my @tmp = @a;
でやれば代入自体は大して時間がかかってないのが分かるぞ。
487 :
469 :2006/11/21(火) 18:07:55
>>486 う~ん、ではやっぱりソート処理の部分が問題なんですかねぇ…
ちなみにCとC++でもまったく同じものを実行してみましたが
何故かC++の方が処理が速かった…
なんか全部予想外の結果だったなぁ…
環境:VC++6.0
C: 0.046sec
C++: 0.015sec
488 :
469 :2006/11/21(火) 18:19:37
色々試してみたらこんな結果になりました。 PHPはコードの書き方が悪かったのかもしれませんが、遅かったです。 C: 0.046sec C++: 0.015sec Ruby: 0.219sec Perl: 0.687sec PHP: 0.761sec
だからPerlは整数のあつかいが
490 :
470 :2006/11/21(火) 18:54:15
確認したら、単に @a = sort {$a <=> $b} @a だと文字列値作りやがる。
恥ずかし過ぎるので、ちょっと pp_sort.c 眺めてみた。
>>487-488 @a = sort { 0; $a <=> $b } @a; にすれば、もうちょっと早くなる。
比較部分に付けた 0; は、perlで記述した比較式を使わせるためのおまじない。
(オプティマイザに「複雑な評価式」だと勘違いさせる)
別に ruby の方が早くても不思議でもなんでもない (
>>479 ) が、
なんで sort 文以外の rand やら int やら c 方式の for 文やらが、
評価されてるベンチマークで、「 sort が遅い」と結論付けてんのか
分からん。
>>490 0.594sec
ちょっとスピードアップです。
my @r;
@r = sort{0; $a <=> $b} @a;
あと、use sort '_quicksort' 入れるとどうも遅くなりますね…
0.719sec
493 :
ぴゅあ :2006/11/21(火) 19:17:37
>>462 ちょっと気になってみたので書いてみてますが…
2chのIDが日付で変わるとかは知らないですが
暗号化(crypt)としてますけど、符号化の処理としてcryptを利用しているという感じでしょうか
>半角10文字までの文字だけが暗号可されるみたいで
8文字ですよね(かつ下位7ビットとされているらしい)@DESの場合でしょう
生成される文字列が13文字であるというのは、11文字の中に種も含まれているということだろうか?と推測しますが
IPを8文字に収め、種に日付を関連付ければ(基準日から)11年分くらいをその11文字で一意な値として得られそうにも思えますけど、実際には13文字(実質11文字)では足りないような気もします
(実際のDES/MD5の実装までは追えてないので…というか追う必要のあるもの?と思うので追ってない)
# crypt()はパスワード暗号化関数である。
というようなところもあるので、必ず一意となることが保証されているものなのか?と、ちょっと疑問に思ったりもします
パスワードの"暗号化だけ"が目的ではないかと思っているので、必ずしも得られるものが一意であることは重要ではないですよね?
目的は
>IPの最初のほうがいっしょのやつはIDがいっしょになって困ってます。
ということでもあり、ちょっと気になったりです。。。
或いはMD5を使うことでその辺りが保証されてくるものなのか
どうなんでしょう
検証できてない推測だけですけどね
あと、cryptはパスワード暗号化関数で、DES/MD5はどちらを使用するかが選択されるものじゃないかなと思ったりもします
494 :
462 :2006/11/21(火) 19:39:54
>>493 どうもありがとうございます。
http://multix.jp/html/memo/030525.html ここに2chのIDについてのっていたのですが
use Digest::MD5;
use Digest::MD5 qw(md5_hex);
sub get_2ch_id {
my $bbskey = shift;
my $rand = shift;
my $ip = $ENV{'REMOTE_HOST'};
my $day = ( localtime )[3];
my $md5 = Digest::MD5->new();
my $ipmd5 = substr( md5_hex( $ip ), -4 );
$md5 -> add( $ipmd5 );
$md5 -> add( $bbs );
$md5 -> add( $day );
$md5 -> add( $rand );
my $id = substr( $md5->b64digest, 0, 8 );
return $id;
}
# printf "ID:%s", &get_2ch_id( 'bbskey', 'rand' );
#
# bbskey は板の名前
# rand は /dev/rand から読み出した16バイトの乱数文字列
# ただし ( localtime )[3] の値がおなじ間は変化しない(再利用する)こと。
↑を使ってテストのつもりでIDを表示してみたら日付で変わるようになったみたいですけど
人のものなのではずしました。
上のようなものを作成するための説明がのってるサイトってありませんかね?
調べてもないんです・・・
use Benchmark qw(:all); use sort '_quicksort'; $N = 100000; push @a, int(rand($N)) for (1..$N); timethese(10, { 'case1' => sub { @b = sort @a; }, 'case2' => sub { @b = sort { $a <=> $b } @a; }, 'case3' => sub { @b = sort { 0; $a <=> $b } @a; }, 'case4' => sub { sort @a; }, }); --- This is perl, v5.8.8 built for MSWin32-x86-multi-thread Windows XP SP2 + AMD Athlon 64 2.39GHz Benchmark: timing 10 iterations of case1, case2, case3, case4... case1: 4 wallclock secs ( 3.84 usr + 0.02 sys = 3.86 CPU) @ 2.59/s (n=10) case2: 2 wallclock secs ( 2.16 usr + 0.03 sys = 2.19 CPU) @ 4.57/s (n=10) case3: 4 wallclock secs ( 4.37 usr + 0.00 sys = 4.37 CPU) @ 2.29/s (n=10) case4: 0 wallclock secs ( 0.00 usr + 0.00 sys = 0.00 CPU) (warning: too few iterations for a reliable count) 0; をつけない方が速いみたい。case2 は10回やって平均約0.22msと、なかなかの好タイム。 代入しない case4 はヴォイドコンテキストなので、実行すらされないわけですね。
496 :
495 :2006/11/21(火) 20:30:41
require 'benchmark' N = 100000 a = [] N.times { a << rand(N) } puts Benchmark.measure{ 10.times { b = a.sort } } puts Benchmark.measure{ a.sort! } --- ruby 1.8.5 (2006-11-02) [i386-mswin32] 0.407000 0.000000 0.407000 ( 0.406000) 0.031000 0.000000 0.031000 ( 0.032000) Ruby は門外漢だけど、こんな感じだろうか。sort!は繰り返しての平均がとれないので1回だけ。 代入付きだと約41ms。in-placeだと約31ms。平均じゃないけど参考までに。
メモリ節約のため必要なときにrequireするようにしたいのですが main.pl $val{'mess'} = "hello world\n"; if (1) { require ''sub.pl"; messprint(); } --------------------- sub.pl sub messprint { print $val{'mess'}; } 1; --------------------- このように書くとうまく動作しません どのように記述すればうまくうごくようになるのでしょうか
>>497 × require ''sub.pl";
○ require "sub.pl";
てかエラーメッセージぐらい書こうよ。
すみません・・・ main.pl +my $val{'mess'}; $val{'mess'} = "hello world\n"; sub.plのサブルーチン内でmain.plの変数の参照ができるようにするには どのようにしたらいいのでしょうか?
my %val;ですね
our %val; じゃないとダメだろう。
あ、できました・・・ ありがとうございます ローカルにするとだめなんですね
>>502 > ローカルにするとだめなんですね
ちょwおまvflkmvkぁd
スコープ外で使えたら局所化している意味がないじゃんYO
>>497 値が欲しいだけなら引数で渡してあげよう。
# main.pl
my %val = ( 'mess' => "hello world\n" );
if (1) {
require ''sub.pl";
messprint($val{mess});
}
# sub.pl
sub messprint {
my $message = shift;
print $message;
}
1;
506 :
469 :2006/11/21(火) 21:17:22
>>495 今、ActivePerlの最新版で試してみたら
何の工夫もない
>>469 と同じコードで、軽く 0.203sec 出ました。
どうやら遅い原因の多くは、古いバージョンのせいだったみたいです…
507 :
462 :2006/11/21(火) 21:29:29
cryptで暗号可すると11文字になりますよね? それを8文字にするほうほうってありますかね?
508 :
462 :2006/11/21(火) 21:59:32
510 :
470 :2006/11/21(火) 22:33:52
あー説明不足だった、申し訳ない。
>>490 は(
>>469 氏が使っている)v5.8.3での話。
(v5.8.7までは同じ)
ソースを比較しながら読んでみたけど、
perl588delta.pod にある
> provided improvements to reduce the memory usage of C<sort>
> and to speed up some cases.
の中身が「数値比較が指定された時に文字列値を作るのを止めた」のと
「全要素が整数ならば、自動的に整数比較を用いる」でした。
5.8.8以降で {0; $a <=> $b} を指定すると、「複雑な比較式用の呼び出し」を
使うオーバーヘッド分が遅くなるだけです。
5.8.7までなら同時に全要素の文字列化が行われなくなるので、早くなる分と
遅くなる分を加えて、今回の例では早くなったと。
511 :
デフォルトの名無しさん :2006/11/22(水) 02:23:15
>>511 人によるだろうけど、リファレンスマニュアルって「読む」ものか?
オレは「読んだ」ことがないから判らんw
>>512 > 人によるだろうけど、リファレンスマニュアルって「読む」ものか?
> オレは「読んだ」ことがないから判らんw
あれは、純粋にPerlに興味がある人間は、読むなと言われても貪るように読む本だが。
俺はラクダ本全部読みきったけどな。 2,3週使ったハズ。最後の関数リファレンスは軽く流し読みしたけど。
515 :
1/2 :2006/11/22(水) 11:50:32
質問があります。 { $str1 =~ /()()()/; test("ほげ", $1, $2, $3); } { $str2 =~ /()()()/; test("ふが", $1, $2, $3); } sub test { $name = shift; ($hash{$name}{value1}, $hash{$name}{value2}, $hash{$name}{value4}) = @_; { $hash{$name}{value2} =~ /()/; $hash{$name}{value3} = $1 ? $1 : 0; } { $hash{$name}{value4} =~ /()/; $hash{$name}{value5} = $1 ? $1 : 0; } } こういう処理をしたいんですが、このままだと呼び出し元の $1がサブルーチン内でも有効であって期待通りの動きをしません。 ですので下の用に書き直しましたが、もっと簡潔に書けませんか? 続く
516 :
2/2 :2006/11/22(水) 11:52:39
{ my @array; { $str1 =~ /()()()/; @array = ($1, $2, $3); } test("ほげ", @array); } { my @array; { $str2 =~ /()()()/; @array = ($1, $2, $3); } test("ふが", @array); } sub test { # 同じ }
517 :
515 :2006/11/22(水) 11:58:05
ごめんなさい、訂正です。 sub test { $name = shift; (${$hash{$name}}{value1}, ${$hash{$name}}{value2}, ${$hash{$name}}{value4}) = @_; { ${$hash{$name}}{value2} =~ /()/; ${$hash{$name}}{value3} = $1 ? $1 : 0; } { ${$hash{$name}}{value4} =~ /()/; ${$hash{$name}}{value5} = $1 ? $1 : 0; } }
質問。 シグナルハンドラを設定するときのサンプルって、たいてい local $SIG{INT} = ... って書いてあるけど、なんでlocalがいるの? $SIG{INT} = ... だけじゃダメなん? うわ、一行ごとの改行書き込みになってしまった。
>>515 意味のないブロック使うなよ、質問はもっと具体的に書いてくれ。
お望みのものはこんな感じか?
==================
sub test{
my $name = shift ;
my %hash ;
$hash{$name} = {
value1 => $_[0],
value2 => $_[1],
value3 => $_[1] =~ /(c)/ ? $1 : 0 ,
value4 => $_[2],
value5 => $_[2] =~ /(o+)/ ? $1 : 0 ,
} ;
print $1 . "\n" ;
return %hash ;
}
my $str = 'hoge-fuga-foo' ;
use Data::Dumper ;
print Dumper { test( "ほげ", $str =~ /(\S+)-(\S+)-(\S+)/ ) } ;
>>518 あとで値を元に戻す必要がなけりゃlocalなくてもいいよ。
プログラムの一部分でだけ有効にしたいときはブロックで
囲んでlocalにしとけばブロック抜けるときに勝手に戻るので
いちいち退避用の変数用意したり戻し忘れないように気を
つけたりといった手間がいらないから楽というだけのこと。
521 :
デフォルトの名無しさん :2006/11/22(水) 13:03:21
&a({ 'mode' => '1', 'test' => 'あ' }); sub a { my %f = shift; print $f{'mode'}; } うまく受け取れないのですがどうすればいいでしょうか?
my $f = shift; print $f->{'mode'};
523 :
デフォルトの名無しさん :2006/11/22(水) 13:41:16
なるほどありがとうこざいました。
リストにして渡してもできた。 どっちがいいんだろう? &a( ( 'mode' => '1', 'test' => 'あ' ) ); sub a { my %f = @_; print $f{'mode'}; }
なにこのスレの伸びっぷり
>520 thx. ↓以下検証コード。 ---------- local $SIG{INT} = sub { print "1\n"; } sleep(10); print "in\n"; { local $SIG{INT} = sub { print "12\n"; } sleep(10); } print "out\n"; sleep(10); 1; __END__ ################################ C:\Docum...>test.pl 1 in 12 out 1 C:\Docum...>
527 :
515 :2006/11/22(水) 15:21:54
>>519 それはどうやって使うんですか?
下のようにしても上書きされてしまいます。
%hash = test("ほげ", $str =~ /(\S+)-(\S+)-(\S+)/);
%hash = test("ふが", $str =~ /(\S+)-(\S+)-(\S+)/);
$hash{名前}{要素}の用に使いたいです。
ブロックは$1のスコープを狭める為に使いました。
528 :
515 :2006/11/22(水) 16:01:38
ごめんなさい読み違えていました。 sub setInfo { $name = shift; $info{$name} = { value1 => $_[0], value2 => $_[1], value3 => $_[1] =~ /(c)/ ? $1 : 0 , value4 => $_[2], value5 => $_[2] =~ /(o+)/ ? $1 : 0 , } ; } my $str = 'hoge-fuga-foo'; setInfo("ほげ", $str =~ /(\S+)-(\S+)-(\S+)/); setInfo("ふが", $str =~ /(\d+)-(\d+)-(\d+)/); $1のスコープの問題も無く、簡略化できました。 とても参考になりました。 ありがとうございました。
初めてPerlを使う者ですが、ActivePerl-5.6.1.638-MSWin32-x86を使ってインストールしました。 ppmを使って、 install time-hires install io-zlib install win32-api install http-lite install Win32-Sound install getopt-long これらを一行ずつ打ち込みたいのですが、うまくいかず Error installing package time-hires : could not locate a PPD file for package time-hires となってしまいます。 どうやれば正しくインストールできることができるのでしょうか? ご教授お願いします・・・。
>>527 お前さんがいいなら、まあいいが……
参考までに hash の merge は、
my %hash = ( %hashA, %hashB ) ;
なんかで実現出来る。527 の例だと
my %hash = test("ほげ", $str =~ /(\S+)-(\S+)-(\S+)/);
%hash = ( test("ふが", $str =~ /(\S+)-(\S+)-(\S+)/), %hash ) ;
文字コードがわけわからん どこが駄目なのかわからんから適当に弄ってたら もう何やってんだかわからん Help me!!
エスパーが来るまでROMってろ
>530 ハッシュのマージだけど、巨大なハッシュならeachでまわした方がメモリ食わないんじゃないか? >531 何がどうわからんのか書かないことには答えようがない。
534 :
530 :2006/11/22(水) 17:49:02
>>533 each とコレ↓とどっちがメモリ食わないんだろ?
@hash{ keys %hashA} = values %hashA ;
まあ、そこまで巨大 hash を使うなら、hash の merge なんてせずにすむ様に
コードの最適化を優先するがw
事故レス cookbook に each が一番って書いてあった
536 :
515 :2006/11/22(水) 20:45:52
>>519 で、testサブルーチンの中の正規表現がどちらも真だった時、
どちらにも同じ値が代入されてしまいます。解決策を教えてください。
value2 => $_[1],
value3 => $_[1] =~ /(\S+)/ ? $1 : 0,
value4 => $_[2],
value5 => $_[2] =~ /(.)/ ? $1 : 0,
結果
'value4' => 'foo',
'value5' => 'f',
'value1' => 'hoge',
'value3' => 'f',
'value2' => 'fuga'
期待する結果は
'value4' => 'foo',
'value5' => 'foo',
'value1' => 'hoge',
'value3' => 'f',
'value2' => 'fuga'
環境:WindowsXP SP2, Active Perl v5.8.8 built for MSWin32-x86-multi-thread
>>536 出しゃいいだけだろが。
sub test{
my $name = shift ;
my %hash ;
$hash{$name} = {
value1 => $_[0],
value2 => $_[1],
value4 => $_[2],
} ;
$hash{$name}->{value3} = $_[1] =~ /(\S+)/ ? $1 : 0 ,
$hash{$name}->{value5} = $_[2] =~ /(.)/ ? $1 : 0 ,
return %hash ;
}
538 :
519 :2006/11/22(水) 21:17:50
537 が答えてくれてるが無理矢理にでも一文での代入がしたければ my ( $tmp1, $tmp2 ) ; $hash{$name} = { value1 => $_[0], value2 => $_[1], value3 => $_[1] =~ /(\S+)(?{ $tmp1 = $^N })/ ? $tmp1 : 0 , value4 => $_[2], value5 => $_[2] =~ /(.)(?{ $tmp2 = $^N })/ ? $tmp2 : 0 , } ; 実行せずに書きこむもんじゃねえな、 っつーか元の $str1, $str2 及び/()()()/ の中身を教えてくれよ。
>>488 ちなみに余談だが、C++が爆速なのはインライン関数のせいからだと思われる。
テンプレートと相まって、例えC99のインライン関数をもってしてもC++にはかなわないはず。
>>539 ソースはこんな感じでした。要はSTLを使ってるか否かの差なんですけど。環境:VC++6.0(C/C++共にReleaseビルド)
----- C -----
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 100000
int compare(const void *a, const void *b){ return *(int*)a - *(int*)b; }
int main(void){
int a[N];
clock_t s = clock();
srand((unsigned int)time(NULL));
for(int i = 0; i < N; ++i){ a[i] = rand() % N; }
qsort(a, N, sizeof(int), compare);
printf("%f\n", (float)(clock() - s) / CLOCKS_PER_SEC);
return 0;
}
----- C++ -----
#include <iostream>
#include <vector>
#include <algorithm>
#include <time.h>
#define N 100000
using namespace std;
int main(void){
clock_t s = clock();
srand((unsigned int)time(NULL));
vector<int> a;
for(int i = 0; i < N; ++i){ a.push_back(rand() % N); }
sort(a.begin(), a.end());
cout << (float)(clock() - s) / CLOCKS_PER_SEC << endl;
return 0;
}
>>540 そうそう、STLのsortはそういうわけで早いわけ。アルゴリズムは(同じコンパイラならおそらくは)同じだとしてもね。
542 :
デフォルトの名無しさん :2006/11/23(木) 00:31:10
ところでおまいら、最新版のActivePerlの PPM がGUIアプリになって 使い方が判らなくて困ってしまいましたよ。 まあ、必要な所 (GD, DBI::ODBC, ..) は最初から入ってたんで ラッキーでしたけどね。
PPM4だっけ?XML::LibXMLだったかな、そこらのインストールで問題があるからまだPPM3のbuild817使ってる。
ppm-shell使えばおk
546 :
デフォルトの名無しさん :2006/11/23(木) 03:02:57
>>544 ,545
詳しく。
CUI の方がやっぱ慣れてていいんです。
コマンドプロンプトから
>ppm-shell <改行>
とかするのかな?
548 :
デフォルトの名無しさん :2006/11/23(木) 03:14:59
いまは動作環境が手元にないのよ。
フーン
open(IN,"test.txt"); while(<IN>){ print; } close(IN); これでプログラムと同一フォルダ内のtest.txtの内容を表示しようと思ったのですが、 openのところで失敗しているようで、うまく行きません。 どうやらtest.txtというファイルが存在しないとみなされているようです。 試しに、openで新しいファイルを作っても、プログラムと同じフォルダにはできず、 パソコンのどこにファイルが生成されているのか分かりません。 何がまずいのか全く見当が付きません。ご指導願います。
カレントディレクトリって分かる? ていうかどうやって実行したわけよ。
コマンドプロンプトから perl "プログラムのアドレス" で実行しました。 すみません、カレントディレクトリについてはよく分かりません...
>>550 > パソコンのどこにファイルが生成されているのか分かりません。
まずそれを調べろよ。
ありがとうございます、chdirでフォルダを指定したら、とりあえず読み込めるようになりました。 区切り文字に\を使用していたのがいけなかったようです。 しかし、デフォルトではカレントディレクトリはどこに指定されているのでしょうか? いままではプログラムとおなじフォルダだと思っていました。 ファイルの生成される場所は、自分のパソコン内の整理が悪いためによく分からない事になってしまっています。
555 :
デフォルトの名無しさん :2006/11/23(木) 10:57:14
すみません subの$_などはCのポインタと考えていいんですよね? sub t { my $a = $_[0]; $a = $_[0] = "あ"; } つまりCでconst みたいにするにはいったん別の変数に移したほうがいいってことですよね?
>>555 > subの$_などはCのポインタと考えていいんですよね?
ちがう。
>>554 > しかし、デフォルトではカレントディレクトリはどこに指定されているのでしょうか?
ひょっとしてあなたが何かコマンドを打ち込んで Enter を押すたび、画面に次のような邪魔くさい文字列が表示されませんか?
C:\Documents and Settings\554>
> ファイルの生成される場所は、自分のパソコン内の整理が悪いためによく分からない事になってしまっています。
例えば「未整理のファイル群から特定のファイルを探す」ような非生産的な単純作業をやってくれるのが、コンピュータという道具です。
>>555 @_ # 組込みの特殊変数。サブルーチンの引数のエイリアスのリストが自動で格納される。
$_[0] # @_ の 0 番目の要素。
@_[0] # @_ の 0 番目の要素のみを含む配列スライス。
そしてこれらは Perl の組込みの特殊変数 $_ とは関係ありません。
>>557 表示されています。つまりこれがカレントディレクトリと言う事でしょうか。
ということで探してみるとそのフォルダにファイルが生成されていました。
つまりperlの問題じゃなかったと言う事ですね、すみません。
コンピュータに効率的にファイルを探させる事は、自分の力不足でちょっと難しかったです。
>>559 > コンピュータに効率的にファイルを探させる事は、自分の力不足でちょっと難しかったです。
・スタートメニュー -> 検索 -> ファイルやフォルダ
・マイコンピュータからCドライブ開いてCtrl+Fでエクスプローラの右に検索
perlを覚える前に利用しているシステム(OS)の最低限の利用方法覚えることを推奨します。
>>537-538 できました。
ありがとうございました。
中身は私的な物なのでごめんなさい。
562 :
デフォルトの名無しさん :2006/11/23(木) 20:24:55
perlmagickを使ってbmp画像を生成して, そこまでは24ビットなんだけども Anotateで文字を埋め込んだ瞬間24ビットから32ビットに 勝手に変わってしまうという現象に悩まされてる. それか,32ビットから24ビットに直すいいツールしりませんか? convert -format BMP24+ a.bmp b.bmp とやってもうまくいきませんでした.
563 :
デフォルトの名無しさん :2006/11/23(木) 20:26:30
X Anotate O Annotate
564 :
233 :2006/11/24(金) 17:01:38
ソートのアルゴリズムをいくつか勉強したのですが、
>>233 のどの変数が一番小さいのかを調べる方法がまだ分かりません。
どなたか、お知恵を拝借させてください。
use List::Util qw/min/; $minimum = min ($number1, $number2, $number3);
最小の値を出したいのか、最初の値を持った変数名を出したいのか
> ソートのアルゴリズムをいくつか勉強したのですが 勉強してもスクリプトにいかせられないんだったら、わざわざ書かなくていいよ。
>>566 >>233 を読むと分かると思いますが後者です。
現在以下のような応急処理を行っているのですが、
要素が増えていけばif文がどんどん増えていくので、
何かいい方法はないのかなと。
$hoge = 3;
$huga = 92;
$foo = 2;
$bar = 39;
@hoge = (
$hoge,
$huga,
$foo,
$bar
);
$min = ソートサブルーチン(@hoge);
if ($min == $hoge) {
print "\$hogeが一番小さい\n";
} if ($min == $huga) {
print "\$hugaが一番小さい\n";
} if ($min == $foo) {
print "\$fooが一番小さい\n";
} if ($min == $bar) {
print "\$barが一番小さい\n";
}
>>568 > 何かいい方法はないのかなと。
最小の値を抽出すればいいだけ。
>>568 my $number = [
{name=>'number1',value=>8},
{name=>'number2',value=>3},
{name=>'number3',value=>4},
];
my $minimum = [sort { $a->{'value'} <=> $b->{'value'} } @$number]->[0]->{'name'};
print "$minimum が最小";
こんなのはどうかね?
最初に名前を付ける必要があるけど。
>>569 値じゃなくて名前が欲しいって書いてね?
571 :
233 :2006/11/24(金) 19:00:26
>>569 ごめんなさい。よくわかりません。
ソートサブルーチン(@hoge);
で配列の中の最小の値を返しています
>>571 あのさあ、普通、不定個の変数のシリーズがある場合には、
配列に入れるんだけど。
で、「どの変数に?」に相当するのはインデックス番号を取得するプレイになる。
あなたはものすごく変なことをしてるんだけど、敢えてやってるの?
>>572 それは何基準?
値じゃなくてラベルが欲しい場合は連想配列のほうがいいと思うんだけど・・・
まぁちょっと考えすぎかな、とは思うけど
質問内容見ればそんなに慣れてないってわかるでしょ
こういう大人が子供をダメにするんだよなあ
あ、でも↑も考え方としては配列のインデックス番号か・・・
>>572 具体的にはこういうことがしたいんですが、
要素がこれ以上増えると式が大変な事になるので
>>568 で対処しています。
ほかに何かいい方法がありますか?
my $applePrice = 100;
my $bookPrice = 500;
my $carPrice = 100000;
if (($applePrice <= $bookPrice) && ($applePrice <= $carPrice)) {
print "リンゴが一番安いです。\n";
} elsif (($bookPrice <= $applePrice) && ($bookPrice <= $carPrice)) {
print "本が一番安いです。\n";
} elsif (($carPrice <= $applePrice) && ($carPrice <= $bookPrice)) {
print "車が一番安いです。\n";
}
577 :
233 :2006/11/24(金) 19:20:42
>>577 おk
my $number = [
{name=>'リンゴ',price=>100},
{name=>'本',price=>500},
{name=>'車',price=>100000},
];
my $item = [sort { $a->{'price'} <=> $b->{'price'} } @$number]->[0];
print $item->{'name'} , 'が' , $item->{'price'} , '円で一番安いです';
hogeとかfooとかbarとかいう奴に容赦する必要は無いと思う。
580 :
233 :2006/11/24(金) 19:37:49
>>578 読み終わりました。
こんなコードが良く思いつきますね。
たくさんレスを付けて頂いて、どうもありがとうございました。
>>579 背伸びしてごめんなさい。
rubyとかpythonに乗り換えた方が幸せになれるんじゃないのかな
配列の最大値・最小値を求める関数が最初からあるし、 ある要素が配列の何番目にあるかを求める関数もそろってる。
へええ
>>583 Perlみたいに
use List::Util;
とかやらなくても良いわけですね。
perl std.pl > stdout.txt こういう感じで標準エラー出力を変えることってできます?
>>586 それはperlの使い方ではなくシステムだろ。スレ違いだ
*STDERR = *STDOUT ; 突っ込めばとりあえず main の STDERR は STDOUT に全部流れるハズ。 そーじゃなくて、use warnings 時の warning を STDOUT に変更したい ってんなら、 local $SIG{__WARN__} = sub { print STDOUT @_ } ; が、586 の質問の仕方だと 587 の云う通り ====== 前者の例 *STDERR = *STDOUT ; print STDERR qq{hoge\n} ;
フォルダ、ファイルのサイズ(使用容量)を返す関数ってありますか?
>589 ファイルサイズなら stat か -s が使える。 フォルダはわからない。 ところで、配列の参照から配列長を知る方法を知りませんか? $array_ref = \@hoge_array; ( $$#array_ref ?)
@{$array_ref}
$#array は配列長じゃなくて最後の添え字番号だと(ry
593 :
デフォルトの名無しさん :2006/11/25(土) 21:52:20
$#$array_ref+1とか?
(´-`).。oO(だから
>>591 のをスカラーで評価すれば。。。scalar @{$array_ref})
595 :
590 :2006/11/25(土) 22:06:37
> 591-593 ご回答ありがとうございます。 ようやく見苦しいソースから開放されます。
597 :
デフォルトの名無しさん :2006/11/27(月) 02:10:46
色んなグラフを表示するサイトを作ることになったんですが、 GDの使い方がよくわかりません。 勉強するのに、詳しくて具体例の豊富な書籍かサイトがあったら 教えていただけないでしょうか? できれば日本語だと助かりますが、英文サイトでも構いません。
>>598 > いったい何様のつもりなんだろう?
編集部は別に偉くないよ。
>>598 100歩譲って君に考えを合わせたところで、
自分の場所で自分の意見を書くのは責められないだろ。
別に個人が猛省を求めるって書くことは自由かと・・・
ここで個人の陰口を書いてる方がどうかと思う。子供っぽい。 文句があるなら本人に直接言えばいいし、言えないなら見なかった事にしとけばいいのに。
>>596 > つまんないね、そういうの。
そんな低レベルなところに面白さを求めるのはダラクですっ!!
志は高く! 下を見るな、上を見ろ!!
ったく、日経は
インサイダーするし、
とばし記事や風説の流布で株価は操作するし、
インタビュー記事では印象操作するし、
あげくのはてに
>>598 のような2ちゃんを使って自分達を批判するものを貶める工作活動かよ。
モラルが欠け、自浄作用も期待できない以上、さっさと潰れちまえ糞マスゴミ社
?????????? ???????? ??????????????? ?????????? ???? ?????C ???????? Java ?? ?????? ?????
Perlを名前くらいしか知らない友人に説明を求められて、 「バッチファイルの凄いヤツ」って言っちゃったんだけど、大丈夫かな? (ちなみにPHPはテンプレートの凄いやつと言った記憶があるが)
perlは終わってるだろう。 他の新しいスクリプト言語使ったら戻る気にならない。 古いスクリプトの修正くらいしか使わないよ。
611 :
デフォルトの名無しさん :2006/11/27(月) 11:06:26
>>610 何使ってるんだ?
pyson?Ruby?
その議論は他でやれ
RubyもPerlも使うけど、直感で書きなぐりのスクリプト 書くのはPerlのほうがいいな。 Rubyで書くときはPerlで書くよりも時間をかけれるときか あとでもう一回使うばあいか大規模な場合。
Perlはそれ自体がすばらしいというよりCなどと併用しやすいのが嬉しいな。(XSはアレだが...) リファレンス⇔Cのポインタの理解がすごく容易だし、文法もCをふまえて拡張してあるから、 理解しやすいだけでなくそれぞれの知識が実際のコーディングの妨げにならない。
古い言語のメリットが、さらに古い言語と併用しやすいことって、こりゃまた後ろ向きだな
perl以外でまともなスクリプト言語って何がある?
奇形スクリプト言語Perlが隆盛にも困ったもんだが
ソフトウェア業界では 古い=枯れていてバグが少ない(エイジングテスト通過済み) なので、ほめ言葉ですよね^^
言語なんてただの道具だ。 もし要件満たせなくなれば捨てるだけのこと。 執着など無用だ。
日本語捨てられますか? 簡単に言語を捨てられるなら、その程度のレベルだったという事。
周りに話す人がいなくなれば 捨てるしかないな
しかしまあ、知ってる言語がPerlだけと言う人を見ると、ゾッとするね。
perlの文法って、良し悪しはともかく面白いと思うので、 なくなったら寂しいな。
おもしろ言語
>>620 ああ、こういう言語憶えるのが目的みたいな人も
いるよね。 まぁ、それはそれでいんじゃない。
いい電動ノコ使いこなしてても、もっといい
チェーンソーが出れば俺は簡単に乗り換えるよ。
電動ノコ名人になりたんじゃなく木を切りたいのでね。
チュンチュン… ハッハッ…
↑流行に踊らされる人間の図
ここは「質問箱」だっての ↓↓何事もなかったかのように質問者登場↓↓
質問です。
質問です。Rubyは使いづらい言語なのにどうして信者は偉そうなんですか? 頭がおかしいからですか?
偉そうな信者はどこでもいるもんだ
Perlにも信者はいる っつーかこの議論は他スレでやれっつの
632 :
デフォルトの名無しさん :2006/11/28(火) 10:50:01
どこのスレでやってほしいのか言ってくれ
633 :
デフォルトの名無しさん :2006/11/28(火) 11:23:33
>>630 いえ、その数がゼロではないことを疑問に思っているのではなく、
Rubyコミュニティがあまりにも「そんなのだらけ」なのは何故だろうというのが
訊きたかったことです。
(Rubyの話題のようでいて、Rubyスレで訊いても意味がないことなので、
彼らに噛み付かれることの多いPerlのスレで訊いてみました)
Ruby 信者は Perl に噛みつくが Perl 信者は Ruby に噛みつかない。 このことから言えることは、 Perl は心の広いおおらかな人が使って いる言語と言えよう。逆に言えば、Perl は心が広くおおらかでないと 使えない言語ということだ。こうあるべきだと理想ばかりを追求し、 それから外れたらすぐにキーっとなって怒るような人には耐えられ ないということだ。 もしつき合うなら Perl を使っている人とつき合いたいものだ。
perlを使ってる人は、負ける議論はやらないだけだ
Ruby信者はあまりにも盲信がひどくて、 負ける議論ばかり始めるからな。
Perlはへたうま言語って感じ。
>>637 それPHP信者でもよくあるんだけどPerl使いはPHPやRubyも触っている事が多い
ので他の言語に噛みつかないと勝手に推測している。
おおらかというかじいちゃんみたいな印象がするかな。
2chで言語比較議論になった時のPerlerの交わしテクを見てるとウケる。
Rubyコミュニティは、Perl4時代のPerlコミュニティを彷彿とさせる。
643 :
デフォルトの名無しさん :2006/11/28(火) 18:58:41
質問です。 パケットキャプチャツール(tcpdump)からの出力を受け取って、 その出力結果をリアルタイムに、その場で加工することが行いたいです。 open(TCPDUMP, "tcpdump |"); while(1){ while(<TCPDUMP>){ #処理 } } 現在は上記で処理しているのですが、どうしても処理が遅くなります。 なので、tcpdumpから入力があった際に処理を行う事にしたいのです。 初歩的質問で申し訳ないのですが、宜しく御願い致します。
644 :
643 :2006/11/28(火) 19:50:39
今の状態で納得いかない点ですが、入力、出力がリアルタイムに行われず、 バッファに溜まったかのような状態になります。 入力があったら即認識し、処理、出力をしたいです。
646 :
643 :2006/11/28(火) 20:07:45
パイプのバッファが原因なようなので、スレチになってしまう話題のようです。 すみません、有難う御座いました。
>>641 うーん。PHP は最初は Perl で作った CGI だったのにな。
まあいいか。
648 :
デフォルトの名無しさん :2006/11/30(木) 02:12:58
649 :
デフォルトの名無しさん :2006/11/30(木) 07:27:19
誰かError.pmの独自例外クラスを作る方法を教えていただけませんか? 資料がなくて困っております。
>>649 他人のコードを読めるなら、Sledgeで使ってるから(Sledge::Exception)読んでみたら?
てか Error::Simple を use base してサブクラス作ればいいだけじゃん
CPANで入れたモジュールを全部消すにはどうすれば良いでしょうか? 初期化でも構いません。
o conf initで出来るみたいですね。事故解決しました。
>>648 http://www.phpoo.net/index.php?p=history.html#history.php PHPの歴史
PHP/FI
PHPはPHP/FIというソフトウェアを継承したものです。PHP/FI は1995年に
Rasmus Lerdorfによって作成されました。当初は オンラインに置いてある
彼のレジュメへのアクセスを解析するための Perlスクリプトの単純な組み
合わせでした。彼はこのスクリプト に 'Personal Home Page Tools' と
いう名前を付けました。 さらに多くの機能が要求されるようになると、
Rasmusはデータ ベースとの連携や、簡単な動的ウェブアプリケーションを
作成 できるようなものをC言語で書き直しました。
>>648 >>まあ、漏れの本業はWEBプログラミングじゃあなく、、
>>Perlスクリプトは本業を効率化する為の道具にすぎんので、
同じく。
鯖缶なので保守用のスクリプトをメインで書いとるよ。
けど、世間ではブラウザで管理するのが流れなのでWeb用も書かないとダメになってきてる。
職業に鯖缶とかスクリプト書いてる人ってどういうことをしているの? 俺のちんけな頭じゃHP、商品売買ぐらいしか思いつかないので 需要があると思わないのだが、この板を見ていると本業にしている 人がちらほら見受けられるので興味がある。 教えてちょ。
需要あるところにビジネスの道あり ~武田信玄 風林火山より~
鯖缶ならアクセスログ解析、ユーザー管理 バックアップ、ドキュメント管理 とかとか色々考えつくけど。
IDCで喉カラカラになりながら地べたに座って作業してる奴だろ
ruby, sed, C++など他の言語を知っている人が てっとり早くperlを学ぶために最初に読むといい チュートリアルとか本はありますか?
>>660 フリーで配付してる掲示板とかのソース。
>660 perldoc フリーで配布してるのもいいけど、KE○Tは駄目。 そんなの読む暇があったらCPAN漁ったほうが楽しいし役に立つよ。
>>662 を見て久しぶりに彼のサイト行ってみたが、今も盛況なんだねえ。
・・・でも置いてあるソースまで昔のままの出来なのな。
他の言語を知ってる人間は、恐らく言語のディテールにウェイトを置いて読むだろうから、
2種類のクオートがまったく意味不明な思想で使い分けられてる点とか、
そういうつまらない粗雑さに引っかかって、無用な足踏みをしちゃいそうな気がする。
確かに彼のソースは読むべきではない。
664 :
デフォルトの名無しさん :2006/12/02(土) 16:40:06
>>660 UNIX/Linuxの知識があれば、最近出た"Minimal Perl"という本がお勧め。
題名通り、最低限の努力で、すでに知っている知識を活かしながら
perlを学習できる。
>>660 > ruby, sed, C++など他の言語を知っている人が
> てっとり早くperlを学ぶために最初に読むといい
> チュートリアルとか本はありますか?
『PerlユーザーのためのRuby入門』……あ、逆か。
666 :
660 :2006/12/02(土) 20:32:38
いろいろありがとうございます。 >>Minimal Perl 洋書よむ気力はないです。 >>『PerlユーザーのためのRuby入門』……あ、逆か。 いい本だったら逆でも役にたつと思うんですが、amazonレビューの 評価が低いですね… 要所だけを押さえた覚え書きみたいのがあればよかったんですが、 とりあえずそこらのチュートリアルやソースをあさって読む ことにします。
667 :
デフォルトの名無しさん :2006/12/02(土) 21:16:56
>>660 殿
ミスティーネットはどうよ、
Cプログラマの漏れが見様見真似で Perl スクリプトを組み始めたときから愛用している
Perlサイトだ。
http://perl.misty.ne.jp/ 関数リファレンスはなかなか秀逸だ
但し、モジュールの使いこなしやら ppm や CPAN モジュールは
ここからもう一歩踏み込まんといかんなあ。
perldoc読むのが一番
ぐだぐだ宣う前にperlstyleなり読んでみろよと叫びたい。 ようするにヘタレ君?
ラクダ本から入ったなー。パラパラ読んだり、じっくり読んだり、調べ物したり。今でも役に立つ。
古い人が陥りがちな思考の罠に、崖の高さが日々高くなっていることに 対する認識不足がある。 10年前、その崖の高さは3メートルだった。ジャンプすれば上によじ登ることが できたのである。 しかし崖は日々高くなり続けた。早くから昇り始めた人は、ときどき崖が すこし高くなっていることに気づくと、高くなった分30センチひょいと 登るというのを数多く重ね、崖の上やその上部に留まりつづけている。 だがふもとから見てみよう。崖の高さは今や20メートルに達している。 初心者がふもとから叫んでいる。 「どうやって登ったんですか~!」 これに 「跳び上がったら上に手が届いたよ~!」 と叫び返してはいけないのである。
>>671 >>660 の「知ってる」の解釈が
名前を知っているだけなのか、きっちり使いこなしているレベルの知っているのかで
扱いがかなり違うんだよね。
ぶっちゃけ後者なら、2ちゃんで聞くまでもなく自分でtarボールの付属ドキュメントを読んで
すぐにperldocを使って文法やコーディングスタイルよんだりCPANを覚えて
いろいろモジュールをDLして使い方覚えたり、ソースを呼んでコーディングテクニックを身につけたりしてるはず。
>670 ラクダ本から入るのはちょっときつくないかな。ま、本格的にやろうと思ったらあれは必須の本だけど。 RubyだとかC++使いこなしてるレベルならいきなりいっても大丈夫か。 あとはPerlクックブックとPerl Best Practicesは必読だな。それだけ読めばあとはもうそれこそCPANのを 片っ端から読んで行くのが一番早いか。
他の言語の経験があるならなおのこと、リャマをなぞってチュートるだけでも通り一遍はこなせるようになるでしょう。 もちろん長く深く使い倒したいならラクダが揃ってた方が圧倒的に便利なのは確か。他の物はそれからでもいいよん。
>>671 俺自身はラクダ本の第2版を買って勉強しはじめたんだが、
今の初心者にいきなり「第3版上下とも買え」っていうのはちょっと酷な気がする
ラクダ本第三版上下でPerlに入門したオレがきましたよっと。言うほどキツくなくて、結構すんなり読めました。 文体が独特で最初はとまどったけど、慣れると逆に明解でわかりやすいって思ったなぁ。 網羅的だから、一通り読むと、他の人のソースとかCPANモジュールとかが大体読めるようになってて驚いた。 あと、細かい所まで書いてあるから、細かい疑問の答えも大体載ってて、ありがたい。 でも、やっぱりプログラミング自体初めてっていう人にはキツいと思う。
>でも、やっぱりプログラミング自体初めてっていう人にはキツいと思う。
質問者の
>>660 は
>ruby, sed, C++など他の言語を知っている人が
>てっとり早くperlを学ぶために最初に読むといい
なので、大丈夫でしょ。
>>672 の前者のタイプだとダメかも知れんけど。
個人的にはperldocでいいじゃんと思うんだけど
>>666 で英語読もうともしないヘタレと判明してるので、そうなるとラクダかな。
>>671 壁は高くなってるかも知れんけど、道具はいっぱい増えてるから。
10年前には、2ちゃんねるなんか無かったし。
そもそも、実際の崖と違って落ちたって死にやしないんだから、
いろいろやってみればいいと思う。その上で、きちんと知りたきゃ
ラクダ本なり、マニュアルなりをあさればいいし。
どうしてもわからい所があれば Google なり2チャンを頼ればいい
と思うぞ。
Readonlyモジュールって一般的ですか? つかってたら嫌がられる? お願いします。
680 :
デフォルトの名無しさん :2006/12/03(日) 12:09:41
>>678 >そもそも、実際の崖と違って落ちたって死にやしないんだから、
>いろいろやってみればいいと思う。
崖の比喩は、「落ちたら危ない」という意味ではなく、
「そこにたどり着くまでに困難である」という意味だと思うよ。
道具がいっぱい増えているには同意
Win32環境で、Unix環境とほぼ同じPerl開発・運用ができるようになるとは
10年前には思いもしなかったYO.
今の会社で運用している鯖はWindows2003Serverなんだが、
ActivePerl入れて、CGI使わせて貰っています。
>679 使ってもいいんじゃない? PBPにも載ってるくらいだし、確か5.10.xだとコアに入るらしいし。
>>680 > 崖の比喩は、「落ちたら危ない」という意味ではなく、
> 「そこにたどり着くまでに困難である」という意味だと思うよ。
道具やドキュメントやコミュニティが多くなったこと自体をも指すね。
> >そもそも、実際の崖と違って落ちたって死にやしないんだから、
> >いろいろやってみればいいと思う。
「いろいろ」の種類が多くなり過ぎたことでもある。
崖が深い == 頂が高い # できる事が多くなってうれしい。 しかし頂に到るまでの崖のどの高さにおいても、誰もが遊ぶことができる。 少なくとも Perl ではそれが公式に認められているらしいぞ。
> 少なくとも Perl ではそれが公式に認められているらしいぞ よくわからんが、公式に認められるとうれしいのか?
685 :
679 :2006/12/03(日) 15:09:27
686 :
683 :2006/12/03(日) 15:38:28
>>684 君のようなスーパーハカーには関係ない。
ぼくのような未熟者にとっては「ぼくは Perl について知らないことばかりだけれど、知っている範囲で遊んでもいいのだ」と思える点でうれしいかもしれない。
687 :
デフォルトの名無しさん :2006/12/03(日) 16:43:50
>>686 そうだな、
C/C++ は、入門してから遊ぶことが出来までの道程が長いから、
そこで挫ける者も多かろう。
Perl はその道程が短いぶんいいよな。
PBP!PBP!
今、サーバー7台使っていろいろ試してます
691 :
デフォルトの名無しさん :2006/12/04(月) 16:02:48
Perl で正規表現にマッチしたとき、文字列のどの場所にマッチしたか知る方法はありますか。 if ($str =~ /foo/) { # $strのどの場所にマッチしたか(index)知りたい }
>>691 if ( $str =~ /foo/ ){
print $-[0] . "\n" ;
}
後は @+ と pos 関数
693 :
デフォルトの名無しさん :2006/12/05(火) 14:11:23
require 5.8.1; use strict; use utf8; open(OUT, '>:encoding(UTF-16LE)', 't:\tmp\16LE.txt') or die; print OUT "\n"; close(OUT); ↑の処理で"16LE.txt"の内容が16進数で「0D,00,0A,00」になることを期待したのですが 実際には「0D,0A,00」でした。期待した結果を得るはどうしたらいいですか? XPPro sp2 ActivePerl 5.8.8.817 よろしくお願いします。
>>694 require 5.8.1;
use strict;
use utf8;
open(OUT, '>:encoding(UTF-16LE):crlf', '16LE.txt') or die;
print OUT "\n";
close(OUT);
手元のlinuxの5.8.8ではこれでいけた。
>>695 ありがとうございます。早速コピペして実行したのですが、結果は変わりませんでしだ。
試しにFreeBSDの5.8.8でコピペして実行したら期待した結果が得られました。
WinのPerlをインストールし直してやってみます。
>>696 あー、インストールしなおしても同じだよ、それ。
Cのライブラリ内で行われている改行の変換が原因だから。
(C/OSがテキストモードとバイナリモードを区別しない環境ではPerlIO内で処理される)
">:raw:encoding(utf-16le)" で開いて、最初から print "\r\n" するのが楽だと思う。
>>697 言われた通りに書き直したら出来ました ! !
ありがとうです。助かりました。
>>694 ,697
バグじゃないかという気がするので
バグレポしたほうがいいんじゃないか。
1.perl.exeがテキストモードでfopen 2.\nがperl.exeでUTF-16LEの0x0A,0x00に変換される 3.perl.exeが書き込む際にfputsか何かで0x0Aが0x0D,0x0Aに変換される って認識でおk?
バグだろう。
バグだね。
バグばぐ言ってる奴 perldoc -f binmode に明記されてる現象の何をもってバグと云うんだ? (しかも BUGS 等に書いてある訳じゃない。注意書きとして書いてある) 仕様だよ。
このスレはperldocも使えなかったり、英語だからと読もうともしない似非perlerがいっぱいだな。。。
>>705 英語力無いオレには読みとれん。 Programing Perl 3rd Edition の binmode に
その旨、明記されてない。問題点間違えてない?
まあ、安易にバグだって云うのもなんだかなとは思うが。
バグじゃないというならバッドノウハウだなw
>>707 駱駝の 3rd は 5.6 ベースの内容で、5.8.x とはかなり違いがある。
5.8.x 使ってるなら perldoc なり
>>2-3 に挙がってる訳なりで
確認した方がいいよ。
5.8.8のperldoc -f binmode読んだがこの問題については 明示的には何も書かれてないように読めた。 705の言っている部分がどこだか示してもらえるとありがたい。
ここじゃねーの? The operating system, device drivers, C libraries, and Perl run-time system all work together to let the programmer treat a single character ("\n") as the line terminator, irrespective of the external representation. On many operating systems, the native text file representation matches the internal represen- tation, but on some platforms the external representation of "\n" is made up of more than one character.
>>710 思いっきり書いてあるだろ。
それとも翻訳させるための釣りか?
The operating system, device drivers, C libraries, and Perl run-time system all work together to let
the programmer treat a single character ("\n") as the line terminator, irrespective of the external
representation. On many operating systems, the native text file representation matches the internal
representation, but on some platforms the external representation of "\n" is made up of more than
one character.
Mac OS, all variants of Unix, and Stream_LF files on VMS use a single character to end each line in
the external representation of text (even though that single character is CARRIAGE RETURN on Mac OS
and LINE FEED on Unix and most VMS files). In other systems like OS/2, DOS and the various flavors
of MS-Windows your program sees a "\n" as a simple "\cJ", but what’s stored in text files are the
two characters "\cM\cJ". That means that, if you don’t use binmode() on these systems, "\cM\cJ"
sequences on disk will be converted to "\n" on input, and any "\n" in your program will be converted
back to "\cM\cJ" on output. This is what you want for text files, but it can be disastrous for
binary files.
そこは普通に改行文字の変換について書いてあるだけで、 encoding(...)と:crlfの順序で結果が違ってくるから:rawで 順序調整しないとおかしくなるってあたりの話じゃないだろ。
英語読めないくせにperldocとか見栄はりさんが多いことがよくわかった。 つーか脊髄反射で物事を処理していると上達しないよ。
>>713 当然だ
今は改行文字の変換についての仕様がperldocに載ってるかどうかの話だろ
:rawの順序云々は
>>703 が言及してるが、それがperldocに書いてあったとは一言も言っていない
それをいうなら普通の改行文字の変換がバグだなんて誰も言ってないよ。
windows環境のperlでencodingをUTF16-LEにしたときに\nが0D,0A,00になって
変だっていう
>>693 が話の始まりなんだから。
とりあえずお前とは話がすれ違ってることはわかった。
717 :
697 :2006/12/06(水) 23:26:27
perlってバグが仕様なんだw やっぱり俺はrubyで行こう。
そうしておけ。 PHPとRubyはいまだにバッファオーバーフローのセキュリティホールで バージョンアップを楽しめるぞ。
もうencoding使うなよ…常識的に考えて…
>>720 それはencodingプラグマのことで。最近話題のPerlIOレイヤのencodingとは
全く無関係ではないが別の話かと。
単純変数のバイト数の上限を指定するような処理はないでしょうか? $buf に外部メールサーバから情報をとってきて格納するプログラムを作成して いるのですが、容量が大きくなりすぎると処理が重くなるので変数の 容量に上限をもうけたいと思っています。
変数$aと$bのうち、値の大きい方を小さい方で割った結果を$cに代入するプログラムを作りなさい。 ただし、$aか$bのどちらかが0のときは$cに0を代入します。 という課題が出ているのですが、ただし以降がわかりません。 どのように入力すればよいのでしょうか?
課題は自分でやれwww っつーかまんまだろうが・・・
>>723 $c = ($a == 0 or $b == 0) ? 0 : ($a > $b) ? $a / $b : $b / $a;
>>722 tie使えば指定した長さ以上入れようとするとエラーになるスカラーとか作れるけど、
普通は格納するときにlengthをチェックするようにすりゃいいだけじゃねーの?
729 :
デフォルトの名無しさん :2006/12/07(木) 15:00:23
>>723 変数名に$aや$bは使うな、って先生に言ってやれ
$number1 = $a; $number2 = $b; $answer = $c; if (($number1 == 0) or ($number2 == 0)) { $answer = 0; } elsif ($number1 >= $number2) { $answer = $number1 / $number2; } elsif ($number2 > $number1) { $answer = $number2 / $number1; } $c = $answer;
いっそ $c = 0+eval { pop(@{[sort $a,$b]}) / shift(@{[sort $a,$b]}) }; や $c = 0+eval { length('a'x$a|'b'x$b) / length('a'x$a&'b'x$b) }; で。
735 :
733 :2006/12/07(木) 19:01:47
>>734 すごくわかりやすいと思うんですが・・・
俺もこう書くねーフンフンと思ってたら笑われてて焦りました
if文で複数行で書くかどうかは好みですかね?
>>735 そう書くなら関数でくるむのが正解
このパターンぐらいなら分かるけど ?が連続するのはちょっとな
質問者が理解できないから、じゃない?<1行
>>735 思いっきり普通だろ。「宿題の提出にはいじわる」ってんで笑っただけだ。
>>736 >関数でくるむのが正解
臨機応変に使うのが正解じゃねw
>>736 ?:三項演算子の読みやすさって整形次第で結構化けると思うんだ。どうよ?
$c = ($a == 0 or $b == 0) ? 0
: $a > $b ? $a / $b
: $b / $a;
$c = $a == 0 ? 0:
$b == 0 ? 0:
$a > $b ? $a / $b
: $b / $a;
# 等幅フォントのエディタにコピペしてみとくれ
FYI で書くが PBP では三項演算子の連続はこういうインデントを推奨してた。 $c = ($a == 0 or $b == 0) ? 0 : ($a > $b) ? $a / $b : $b / $a ; なにが条件で代入するものがなにか判りやすいからだと。 ちなみに「elsif を使うんじゃねえ」とも書いてあったw これには同意しかねるが。
741 :
740 :2006/12/07(木) 19:53:55
かぶってしかもインデントくずれた 739氏のを採用してください orz...
>>740 $c = ($a == 0 or $b == 0) ? 0
: ($a > $b) ? $a / $b
: $b / $a
;
ね。等幅エディタで。@Perl Best Practice
743 :
デフォルトの名無しさん :2006/12/07(木) 20:02:11
初心者です 簡単な質問でスミマセン ある配列に AAA BBB CCC CCC DDD と格納されているとします。 ダブってるCCCをひとつ消して AAA BBB CCC DDD とするにはどうすればいいのでしょうか
>>743 @hoge = qw( AAA BBB CCC CCC DDD ) ;
%seen ;
@uniq = grep { ! $seen{$_} ++ } @hoge ;
答えをすぐに出しすぎだろ・・・
テンプレ
>>3 あたり全部読めば載ってるはず
つねに教育的指導を心がけないと、次第に質問者が堕落してゆく現象が 知られています。
自治厨乙
今日は3つぐらい続けて初心者的質問が出たから、一応ね。 答える側の住人も注意すべきかなと。 自治しなきゃ誰かが解決してくれるわけでもなし。
>>750 質問者は同一人物だろ?
そのうち飽きるさ
>>749 uniq するときの有名な手法の一つだよ。応用も効くので覚えておいて損はない。
下の例は拡張子を判断して各拡張子の一番若いものを grep する。
@list = qw( 00.jpg 10.png 05.png 01.jpg ) ;
%seen ;
@grepped = grep { $suf = (/\.(.*?)$/)[0] ; ! $seen{$suf} ++ } sort @list ;
print @grepped , "\n" ;
# まあ名前の長さが違えばもう一工夫必要になるけどね。
>>747 のような輪郭がぼやけてるけど確かに感じている物を端的に述べてるレスが
2ch見てるとたま~にあってそれを読むとすごく気持ちいい。
自画自賛乙
>>750 のような輪郭がぼやけてるけど確かに感じている物を端的に述べてるレスが
2ch見てるとたま~にあってそれを読むとすごく気持ちいい。
自画自賛乙
質問者を資料のある方向に導くことを心がけましょう
いやです。
>>739 ,
>>740 やっぱりあまり綺麗だとは思わないけどなぁ
ダミアン・コンウェイは尊敬しているが
質問です splitを使って2次元関数を作りたいのに、うまくいきません たとえば、 @tnk = split(/,/,"a,b,c,d"); @unk[3] = split(/,/,"a,b,c,d"); tnk[0]に"a"、[1]に"b"が入っていくように、 これでunkの[3][0]に"a"、[2][1]に"b"・・・と入れたいのに、うまくいきません どうすれば2次元配列が作れますか?
761 :
760 :2006/12/08(金) 00:15:54
下から2行目 [2][1]ではなく、[3][1]です
>>760 $unk[3] = [ split(/,/, "a,b,c,d") ];
以下、詳しい説明が必要なら。
配列変数はあくまで「スカラ値」の集まりなので、
split が返す「スカラ値のリスト」を1つの要素として代入する事はできません。
Perl での2次元配列は、配列変数のリファレンスを利用します。
リファレンスはスカラ値の一種なので、配列の要素として利用できるからです。
配列変数のリファレンスを作成するには [ LIST ] という構文が便利です。
LIST が入った匿名の(名前を持たない)配列変数へのリファレンスが作成できます。上の例なら
@unnamed_array = split(/,/, "a,b,c,d");
$unk[3] = \@unnamed_array;
とほぼ同じ意味です。
ちなみに、配列の中の1要素を添え字で参照する場合、取り出される値はスカラ値なので
@unk[3] ではなく $unk[3] のように、スカラ値を表す「$」を使う必要があります。
当方XPなんですが、ActivePerl 5.8.8.819をインストールしようとすると インストールパッケージを開けませんでしたとでてインストールできませんでした ActivePerl 5.6.1.638のほうはうまくいったんですが、最新版の方は 何か特別な制約があるのでしょうか
↑すいません、インストーラの問題でした。 スレ汚し申し訳ないです。。。
>>759 TMTOWTDI だから使わなきゃいいだけじゃねw
俺にとっては三項演算子は必須になってる
質問です sexを使って3次元の子供を作りたいのに、うまくいきません たとえば、 $tnk->setSpirit("どどどどうていちゃうわ"); $mnk->setJob("風俗嬢"); sex($tnk, $mnk); $manの$man{'osiri'}に$tinkが入っていくように、 $mnkに$tnk・・・と入れたいのに、うまくいきません どうすれば3次元の子供が作れますか? マジレスお願いします。
>>766 標準出力がティッシュのままなので、selectで正しく指定し直し。
sex関数も基本的には、先入れ先出し(FIFO)処理に書き換えて下さい。
ツマラン
770 :
760 :2006/12/08(金) 09:19:04
>>762 想定どおり動きました!
単なる知識不足だったようで、現に詳しい説明の部分が理解できません
そのあたりを勉強しなおしてきます
ありがとうございました
以下のプログラムはなぜ"NG"となるのでしょうか? どうか教えてくださいm(_ _)m Perl v5.8.8 built for i686-linux #!/usr/local/bin/perl $a='A¥[B¥]C'; if ( $a =~ /A¥[B¥]C/ ){ print "OK¥n"; }else{ print "NG¥n"; } あと、任意の文字列を=~で比較しなくてはいけないとき、 "["のような都合が悪い文字列が入ってきた場合にそなえるのは 「quotemetaで処理」が適切なのでしょうか quotemetaし忘れて=~で落ちるバグを修正しようとしたのですが、 上記のプログラムがなぜかNGになるので修正しきれないのです(; ;)
$a = 'A¥[B¥]C'; if ($a =~ /A¥\[B¥\]C/ ){ print "OK¥n"; } else { print "NG¥n"; }
>>773 (全角記号がもともとは半角であると仮定して)
正規表現では \[ は '[' という文字にマッチするので、 '\[' という二文字にはマッチしません。
'\[' にマッチするのは \\\[ です。
つまり 'A\[B\]C' にマッチする正規表現は /A\\\[B\\\]C/ です。
776 :
773 :2006/12/09(土) 07:59:13
>>774 >>775 言われて気づきましたorz (バグであせっていたのかも)
なんでもかんでもquotemetaすりゃいいってもんじゃないんですね・・・
どうもありがとうございましたm(_ _)m
>>773 > 「quotemetaで処理」
えと、正規表現側の話だよね?まさかと思うけど変数側(ここで云う $a)じゃないよな?
この前提だと御前さんの提示したスクリプトに quotemeta の入る余地はないんだけど。
(quotemeta 使用例)
$str = 'a\[b\]c' ;
$quo = quotemeta $str ;
print $quo . "\n" ;
if ( $str =~ /$quo/ ){ print "quote\n" ; }
if ( $str =~ /$str/ ){ print "not quote\n" ; }
変数側の話しだとすると「すごおおおおく間抜けな事をやってる」とだけコメント
しとく。
(間抜けな例)
$quoquo = quotemeta $quo ;
if ( $quo =~ /$quoquo/ ){ print "quotequote\n" ; }
それと 「quotemeta しわすれ」てのが理解できん。何せ提示された例の正規表現
は、直接文字列で作成されてて変数なんて見に行ってないから。
778 :
773 :2006/12/09(土) 13:44:02
>>777 一応マヌケじゃないほうの例です
簡単のために
>>773 のように書きました
機能追加を重ねていったスパゲッティなのでこのへんで
780 :
デフォルトの名無しさん :2006/12/11(月) 22:10:46
age
781 :
デフォルトの名無しさん :2006/12/12(火) 21:41:11
eucで書いたperlプログラムをwindowsで実行すると文字化けしてしまいます。 windowsのシェルはsjisしか表示できないらしいので、 nkf.exeを使って、perl a.pl | nkf -sとしたんですが、 リアルタイムで実行結果が表示されず、実行しているときの状況が分りません。 a.plに$|=1;と記述してもだめです。 どうすればいいでしょうか?
782 :
デフォルトの名無しさん :2006/12/12(火) 22:29:49
かいけちゅしました。perl -Mencoding=euc-jp,STDOUT,shift-jis a.plと打てばできまちた
急に過疎ったなあ
ごめん、誤爆
786 :
781 :2006/12/13(水) 00:27:54
すいません。また問題が出てきました。 >perl -Mencoding=euc-jp,STDOUT,shift-jis a.pl と実行すると、表示はsjisで出力されるのですが、 LWP使ってる部分↓ $ua=LWP::UserAgent->new(); $res=$ua->request($request); $res->contentの中身が 500 Wide character in syswrite になってしまいます。 何かいい方法教えてください。
そういう用途なら-Mencoding使うより、 nkf -E -s -u としてnkf側で解決したほうがいいんじゃないか。 ただしこの場合でもa.plのSTDOUTを$|=1にする必要はあるかも。
788 :
デフォルトの名無しさん :2006/12/13(水) 01:08:27
>>787 やっとできました!!
まじでありがとうございました。
789 :
デフォルトの名無しさん :2006/12/13(水) 16:31:33
配列の連結って可能ですか? たとえば a[]=("あ","い");#a[0]="あ";a[1]="い"; ↓ a[0]="あい"; にしたいのですが・・・ 初心者ですみません;;
文字列連結して入れなおすしかないかな
791 :
:789 :2006/12/13(水) 17:36:19
>>790 そうですか^^;
ありがとうございました
Perl じゃなくて PHP に見えるのだけど、見間違いだろうか
>>789 join すればおk
@a = ("あ", "い", "う");
$a[0] = join "", @a; # => "あいう"
>>792 たぶん見間違い。俺には Perl でも PHP でもないものに見える。
pherl知らないの?
10からカウントダウンして0まで表示させるプログラムを作りたいのですが このうち5のときは数字の5の変わりに「!」を表示させたいです。 どうすればよいのでしょうか? 多分forを使うと思うのですが、いまいちわかりません。
テンプレサイトでif文を勉強してからfor文を勉強しましょう。 入門書の購入を進めます。
798 :
797 :2006/12/13(水) 22:29:33
自己解決しました
ダメ元で質問させて下さい。 文字列の中で##から始まっている英数文字列があった場合 <font>タグで囲って文字を赤くしようとしていますが、この状態だと ユーザーが任意にタグを挿入出来てしまうため置換処理を入れました。 ただ、そうしてしまうと<font>タグもむき出しになってしまい赤く表示することができません。 非常に分かりにくくてすみませんが、何かいい方法はないでしょうか? --- $tmp = '<A> ##B <C>'; $tmp =~ s/</</g; $tmp =~ s/>/>/g; $Str = '##[A-Za-z0-9*.?<>\+\#-.,;]+'; $tmp =~ s/($Str)/<font color=FF0000>$1<\/font>/g; print "$cmt"; --- ↓現実 <A> <font color=FF0000>##B</font> <C> ↓理想(##赤は赤い) <A> ##B <C>
$cmt =~ s/</&lt;/g; $cmt =~ s/>/&gt;/g; 3,4行目はこうです、失礼しました…
$tmp と $cmt を統一して
>>799 ,800 だけだと上手くいってるようだが。
他にも処理してるとかループさせてるとかじゃないのか?
$cmt→&tmpの間違いです。度々申し訳ないですorz
もちつけぺったんぺったん♪
赤ではなく青でした。 何度も申し訳ないですorz
配列変数で、 @a=(あ,い,う・・・こ) @b=(100,200,300,・・・1000)と定義づけて それをfor文であらわすとき for($i=1 ; $i<=10 ; $i++){ print "$i $a[10] $b[10]\n"; } でよいのでしょうか? 表示させたいのは 1 あ100 2 い200 3 う300 4 え400 5 お500 6 か600 7 き700 8 く800 9 け900 10 こ1000 です。
>>806 試してから質問しましょう。
良いか悪いかが分かります。
808 :
806 :2006/12/14(木) 22:10:37
@mon=("あ","い","う","え","お","か","き","く","け","こ"); @mom=(100,200,300,400,500,600,700,800,900,1000); for($i=1 ; $i<=10 ; $i++){ print "$i $mon[0] $mom[0]\n"; } でやってみたのですが、 1 あ 100 2 あ 100 3 あ 100 4 あ 100 5 あ 100 6 あ 100 7 あ 100 8 あ 100 9 あ 100 10 あ 100 となってしまいます。 右側二列も数字をずらすためには、どうすればよいのでしょうか?
$mon[$i - 1]
810 :
806 :2006/12/14(木) 22:19:49
>>809 出来ました!
でも、この-は何なのでしょうか?
インデックス番号は0から始まる 知らないで配列扱うとは・・・
そんな君には $[ = 1; がオススメ
>812 そんな余計なこと教えるなよ
>>808 こんなんでわかるか?
print "$mon[0]\n";
print "$mon[1]\n";
print "$mon[2]\n";
print "$mon[9]\n";
Devel::Sizeでアレイやハッシュが使用するメモリのサイズとか確認できますが Devel::Sizeモジュールをインストールせず、同様のことは可能でしょうか? 自由にモジュールインストールできない環境なので、何か方法あれば教えてください
>>815 内部APIを使わないなら無理。B::*使えば出来るかも知れんが、無謀だな。
そもそも何故メモリサイズを知ることが必要?
>>816 簡単に言うと仕事で頼まれたからw
私もあまり意味はないと思うんですが、動作が遅いプログラムがあってその調査の一環
プログラム内部で、階層構造のリファレンスハッシュで画面出力用にデータを編集しているところが
かなりメモリを食ってるみたいで、具体的にどれくらいか調べたいと思いました
psで確認するとプログラムの使用メモリが多いけど、遅い原因はDBアクセス等の効率が悪いだけだと思ってます
Devel::Sizeを使用しないと非常に難しいと言うことはわかりました
ありがとうございます
>>817 プログラム速度の測定なら、メモリ消費量を調べるよりDevel::DprofやDevel::Profile(標準じゃないがPurePerlだから使うのは簡単)で調べた方がいいと思うが。
>>817 スクリプトが原因でスラッシングしているなら遅くはなるだろうけど
スラッシングしていないなら、メモリ使用量と動作が遅いはあんまり関係ないでしょ。
#少ないには越したことないけど;p
psはtelnetかsshでログインして確認したのですか?
サーバ上でシェルが使えるならコンパイラ使えればroot権限なくても
モジュールをコンパイルして使えますよ。
Devel::DprofやDevel::ProfileでプロファイルをとるかBenchmark, Time::HiResを使って
ボトルネックを探すほうがいいと重いますよ。
>>815 かかる手間を考えると趣味専用になるが、移植性を無視すれば可能。
・リファレンスを文字列評価すればスカラーヘッダ構造体のアドレスがわかる
・unpackのPは特定アドレスからメモリの中身を読み出す事ができる
からね。
これ(PurePerlによる変数dumper)を書く事でPerlの変数に対する理解はすすむので、
話のネタとしては面白いかもしれない。
>>820 こりゃおもしろいなあ。何か他に使い途ないかな?
822 :
デフォルトの名無しさん :2006/12/16(土) 09:46:46
C言語でいう__func__や__LINE__などのマクロはありませんでしょうか デバッグログに使用したいと思っております。
すみません、質問宜しいでしょうか 宛先が自分のIP以外のUDPパケットを受信したいのですが、どうすれば良いのでしょうか もしモジュールを使用する場合は標準モジュールの範囲内でお願いします
ソケットをrowモードでひらけばいいじゃん
>>820 アドレス欲しいなら数値評価のほうがよくね?
826 :
822 :2006/12/16(土) 15:25:28
ググりました。以下のものはありましたね・・・ __LINE__ __FILE__ __PACKAGE__ __END__ __DATA__ __FUNC__は無い認識でよろしいでしょうかorz
828 :
デフォルトの名無しさん :2006/12/16(土) 22:20:08
perlに触れて2日目です。。かない痛いミスしてるかもしれませんが、何方か教えてください。 Flashからcgiへ変数$nameを渡す実験をしているのですが、$nameを日本語にすると すべて文字化けしてしまいます。手元にある入門書を参照したところ、jcode.plを使えばよいとあったので、 require 'cgi-lib.pl'; require 'jcode.pl'; &ReadParse(*name); &jcode::convert(*name,'sjis'); print "$name"; としたのですが、まだ文字化けします。sjisにしてもeucにしても同じ結果です。 どうすればよいでしょうか。jcode.plが存在するディレクトリは確認しました。
>>828 >>1 を読んで、WebProg板へどうぞ。
ちなみに cgi-lib.pl も jcode.pl も、もう古いです。入門書を変えましょう。
830 :
820 :2006/12/16(土) 22:39:08
>>825 何となく、数値評価だとdoubleとかintが面倒な気がして文字列から。
現行の5.8.8あたりならまだしも5.6とかになると、ちょっと迷わない?
(一応 5.6.0でも pack('I',$ref) だとdouble評価を経由しないけど)
831 :
デフォルトの名無しさん :2006/12/17(日) 04:18:03
変数$iがオーバーフローしたかどうかってどうやって判断するんですか?
832 :
デフォルトの名無しさん :2006/12/17(日) 17:21:31
perl -e "$i= 2; while ($i > 0) {$i **= 2; print $i, qq{\n};last if $i eq '1.#INF'}"
834 :
デフォルトの名無しさん :2006/12/18(月) 02:42:35
perl -e '$_="000aaa111aaa222";/(\d{3})/;print "$1\n"' これで表示を 222 とするにはどうすればいいでしょうか?
>>834 ちゃんと基準を日本語で言ってくれないと意味違うの答えが複数ある。
文字列の一番最後なのか三番目なのか。$1に入れないといけないのか取り出せればいいのか。
とりあえずそのデータに対して動けばいいなら/(\d{3})$/とでもしとけ
>>835 最後のものにマッチさせて、それを取り出したいってことです。
837 :
デフォルトの名無しさん :2006/12/18(月) 03:27:13
perl -e '$_="000aaa111aaa222";@nums=/(\d{3})/g;print pop @nums' こういう動作を一度にやりたいです。
perl -e '$_="000aaa111aaa222";/.*(\d{3})/;print "$1\n"'
>>837 perl -le 'print + ( split /aaa/, "000aaa111aaa222")[0] '
perl -le 'print + ( "000aaa111aaa222" =~ /(\d{3})/ )'
perl -le 'print + ( unpack "A3", "000aaa111aaa222" ) '
perl -le 'print + ( substr "000aaa111aaa222" , 0, 3 )'
841 :
デフォルトの名無しさん :2006/12/18(月) 11:14:25
リストファイルからの検索方法に付いて 例えば変換対象の内容をリストファイルと照らし合わせ リストファイルの内容と一致した場合にファイルへ出力るすには どうしたら良いでしょうか? 例えばリストファイルが aaa bbb ccc として、変換対象のファイルが aaa test1 abc test2 bbb test3 だった場合は aaa test1とbbb test3の抽出をしたいです。 openや関数を使ってみたけどうまくいかないので誰か教えてください。
リストを存在確認用の連想配列に入れて 対象を1行ずつsplitして 0番目が連想配列に存在したら吐き出す
素で shift と間違えたorz...
>>837 訂正だ。
perl -le 'print + ( split /aaa/, "000aaa111aaa222")[-1] '
perl -le 'print + ( "000aaa111aaa222" =~ /.*(\d{3})$/ )'
perl -le 'print + ( unpack "A3" x 5, "000aaa111aaa222" )[-1] '
perl -le 'print + ( unpack "@*X3A3", "000aaa111aaa222" ) '
perl -le 'print + ( substr "000aaa111aaa222" , -3 )'
>>843 みたいに + を誤爆回避の為に ( ) に付けるとき、 + と ( ) の間を空けられると、
func + (123) で func の返り値と123を加算してるのか、それとも func を 123 で呼び出してるのか
一瞬迷うのは僕だけですか><
参考書を買って、参考書通りのに書いたのですが19行目でエラーが・・・ HTMLファイルからフォームで送られたデータを表示させるCGIです require './cgi-lib.pl'; &ReadParse; print <<'EOD1'; Content-type:text/html <html>~省略~<table border=1> EOD1 print "<tr><td>会社/自宅</td><td>$in{'addr'}</td></tr>\n"; ~FORMからのデータ表示繰り返し~ print "<tr><td>メール配信</td><td>$in{'mailreq'}</td></tr>\n"; print <<'EOD2'; ←19行目。ここでエラーが出てる </table><form action="register.cgi"><input type=submit value="登 録"></form></center></body></html> EOD2 二回目の「print <<」を止めてprint文にすると上手くいくのですが、「print <<」が二回使えないという記述がないですし 参考書が間違ってるということにもなります。 すいませんが何が駄目なのか教えて頂けないでしょうか
>>846 「絶対できる!自宅PCでCGIの実行環境を構築」というHPを参考に自分のPCでCGIを試せる様にしてます
でコマンドプロンプトで実行してみると下記のエラー文がでます。翻訳サイトで見ても意味が分りませんでした
D:\cgi>perl entry.cgi
Can't find string terminator "EOD2" anywhere before EOF at entry.cgi line 19.
ヒアドキュメントの識別子の後ろには改行必須
すいません。文を短くするために書き込みの際に改行を少しいじりました 実際は全部に改行を入れています。問題の部分を正確にせずすいませんでした print <<'EOD2'; </table> <form action="register.cgi"> <input type=submit value="登 録"> </form> </center> </body> </html> EOD2
>>848 あ、わかりました。識別子のことをよく理解してなかったみたいです
EOD2の後に改行を入れろ ということですね
ありがとうございます
正規表現で使った変数$1を削除することは出来ますか? undef $1;としてみたんですが動きません……
削除する理由は?
できるかできないかを答えてくださると嬉しいです。 できれば質問に質問を返すのは控えてください。
なにこれ
たまにいるんだよな、こういうの・・・ どんな脳みそしてんだかさっぱりわかんねw
>>855 人の属性について訊いているのではなく、Perlのできる・できないを訊いているのです。
もしかして、回答する知識がないのにしゃしゃり出ているのですか?
>>856 同意ですね。
質問に質問を返す意味がさっぱりわかりません。
そして、その当然の「おかしさ」を指摘されてヒスを起こすのも更にわかりませんよね。
(回答者は理不尽に振る舞ってもいい、その理不尽を質問者は指摘せず享受せよ、
とでも勘違いしているのかもしれませんね。
でも回答者ですらないのですから、その発想は二重にナンセンスというべきでしょう)
>>859 >
>>856 はおまえに言ってんだよ
でしょうねえ。
(それがわかっているから、色々と言葉を乗っけて
「それに該当するのはあっちだよ」と教えてあげているわけです)。
> 質問者が理不尽なのに
まったく理不尽ではないですね。どう理不尽だと思い込んでいるのでしょうか?
質問に質問を返してきた人間に「質問に質問を返されては困る」旨を伝えたことですか?
でも、質問に質問を返してきた人間は「回答者」ではないですから、
「質問者として回答者にどういう態度をとるべきか」というテーマで仮にあなたが
粘着したいのだとしても、
>>852 と
>>853 の関係にはまったく当てはまっていません。
なぜならこの2つのレスは、質問者と回答者の関係ではないからです。
イタイ人が出てきちゃった。スルーで。
そうですね、イタイ人はスルーするのが良いと思います。 今回はちょっと時間があったので、どこがイタイのか丁寧に教えてあげましたが、 こんなことをする義理は無いですからねえ。
ここには質問者も回答者もいません。みんな平等です。 さようなら。
なにしに来たのかわからんなぁ。 最初に答えた人も、$1を削除する以外の方法を提案するためだろうし 機能についてききたいだけならperldocで十分だし。
>>859 さん、ここではみんな平等だそうですよ。
質問者の態度ばかり注文つけるのはおかしいようです。次から気をつけて下さい。
>>864 一連の「回答者でもないのに質問者に尊大な態度を取る人」がそんな感じですね。
回答するだけなら「できる・できない」で十分なのに、
その何倍もの文章を何のために書きに来たのかが「わからんなぁ」です。
答を知らない人=回答者になりようもない人、が、あたかも回答者候補であるかのように
装って「ただ尊大な態度を取りにきた」なら納得ですが。
正解はperlvar読め。 $<digits> Contains the subpattern from the corresponding set of capturing parentheses from the last pattern match, not counting patterns matched in nested blocks that have been exited already. (Mnemonic: like \digits.) These variables are all read-only and dynamically scoped to the current BLOCK. 読み取り専用なので値は(パターンマッチの副作用以外では)勝手に変えられない。 当然undefで未定義値を設定することもできない。 無理にやろうとすると Can't modify constant item in scalar assignment at ほげほげ というエラーになるはずなので、エラーメッセージをperldiagで調べてもよい。
>>867 どうもありがとうございます。
こんなに丁寧に教えて下さって恐縮です。
これを足場に、他にも頑張って色々調べてみますね。
いるんだよなぁ。はっきりレス番指して言われないと自分だと認めない人が。
>>865 全くおかしくない
礼儀のないってない奴に答える義務はない
ここに居る人間は回答者ではなく、回答者になる可能性のある人たち
あるいは質問者になる可能性のある人たち
>できれば質問に質問を返すのは控えてください。
などという一文は回答してくれるかもしれない人に対して横柄に過ぎる
平等ではない
建前であっても立場をわきまえろ
>>867 答えるべきじゃないだろ・・・常識的に考えて・・・
>>869 レス番の有無はあまり関係ないと思いますよ。
「誰にともなく言っているかのような」気持ちの悪い書き方を選んでいるレスには、
今回のように「ああ、あの人はそうですよね」という書き方で「本当にそれが当てはまる人」
のことに触れる――つまり「気持ち悪さが当人に跳ね返る」因果応報を狙うわけですが
(レス番を書かない人は往々にして、こちらが「対象をきっちりわかってあげる」と
「なんだ、自覚あるんだw」とか「被害妄想乙」という風に、スレをベトベトさせる方向に
頑張り出すので、スレのためにも「お前に言ってるんだよ」と言わせるよう「焙り出す」必要が
あるわけです)
もしレス番を指定してストレートに何かを言ってきたとしても、同じ内容を
「いいえ、それは○○のほうですね」というフォーマットで返すだけのことなわけですから、
認めるとか認めないとか、そういうのにはまるで関わってこないのではないでしょうか。
一応の回答は得られて満足しているならそれでもいいのだが、 できないということを知っただけではやりたかったことを 実現する助けにはならない。852の言うことに耳を貸して こういうことがやりたいんだけどというのを説明していれば より的確な助言が得られたかもしれないんだけどね。
いるよね、自分がキモイって気づかないキモイ人・・・
>>870 > 回答者になる可能性のある人たち
すべてが終わってから「可能性があったのだ」と言い張るのは実に便利だから
そのやり方に飛びつく気持ちはわかりますが、
「質問に質問を返す人」や、「質問に質問を返すのはいかがか」という意思表示を
自分が侮辱されたように思ってしまう「自分を質問に質問を返す人の同類に位置づけていて」
且つ「正論を言われるとムカついちゃう、ちょっと変な人」に、その可能性があるとは
思えませんね。そもそもちっとも横柄ではありませんし。
粘着しちゃったよ。だからスルーしろと
ここでレスしないと負けた気になるのが悔しいが 常識のある一社会人としてはこれ以上荒しにつきあうわけにもいかない 続きはVIPで。
>>質問者
質問に質問で返されてブチ切れる理由が分かりません。
>>864 ,872のレスにもあるように、それは解決への良い手段だと思いますよ。
自分の質問への回答だけが書かれるわけじゃないんだから、 自分の質問への回答だけが欲しいんなら他のはスルーしろよ。
もうこの件は飽きた。新しい質問マダー?
もまえらどうでもいいことでヒートアップしすぎもちつけ! スレの主旨と違う議論は他でやるなりスルーしろ。
質問文に対し質問文で答えるとテスト0点なの知ってたか?マヌケ ってのを延々と慇懃無礼に続けてたわけね。 単純に興味があったから何でそんなことするのと聞いただけだろうに。
興味じゃなくてアドバイスの1歩目じゃね?
バカ相手すんのはいい加減疲れるね 質問の意味がわかれば、モアベターなアドバイスも出来るだろう? まあ質問する側として礼儀もわきまえないような他力本願のカスに教えることなんぞない
換気換気
>>834 を見て思ったのだけれど、
マッチ対象がもっと複雑なパターンだった場合は良い方法ある?
例えば
HOGE1a2bFUGA3c4d5!PIYO
こんな文字列があったときに、一番最後の
(?:[[:digit:]][[:alpha:]])+
な部分(上の文字列では3c4d)を取り出したいと言う場合とか。
.*で食わせるだけだと3cが引っかからなくなるし、後の部分を
[^[:digit:]]*$
のようにそれ以外の文字に限定することもできない気がする。
/gでマッチしてから最後を取り出すしかないかな
>>886 こんなのはいかが?
/((?:[0-9][a-zA-Z])+)(?!.*[0-9][a-zA-Z])/
>>887 おお、なるほど
否定先読みでそれ以降にそのパターンを含んでいなければ、とするのね。
これなら確かに大抵のパターンは/($regex)(?!.*$regex)/でできますね。
実際に書くときに使うかどうかは別問題だけれど勉強になりました。㌧
889 :
822 :2006/12/19(火) 01:25:09
#規制くらってました・・・
>>833 おお!こんなものがあったのですか!ありがとうございます
>>827 >なければ書いたらいいじゃない。
呼び元のサブルーチン名or現在のサブルーチン名を
取得する方法ってあるのでしょうか
もしありましたら教えてくださいm(_ _)m
>>889 > 呼び元のサブルーチン名or現在のサブルーチン名を
> 取得する方法ってあるのでしょうか
(゚д゚)
だからcallerだって
sub __func__() { return +(caller(1))[3] }
891 :
822 :2006/12/19(火) 02:26:24
callerに引数を与えると、与えないとき以上の情報が得られるのですね 教えてくださいましてありがとうございました 自分乙 o...rz
perlで条件判断でnorやnandを使う時は norの時は!( $boolean1 || $boolean2 )、 nandの時は!( $boolean1 && $boolean2 )と書かないといけないのでしょうか。
mainパッケージにあるグローバル変数を 修飾なしで他のファイルで使う方法はありませんか? #コード ファイル1 ourtest.pl #start use strict; use b1; package a; our $x; $x = 10; #package b; #print $x, "\n"; # パッケージaの$x #同一ファイル内なら表示可能 b1::printit(); #end ファイル2 b1.pm #実行時エラー #start package b1; use strict; sub printit { print $x, "\n"; # パッケージaの$x # print $main::x , "\n";なら表示可能 } 1; #end
すいません、間違えました。 メインパッケージの変数を他ファイルで使いたいのです #コード ファイル1 ourtest.pl #start use strict; use b1; our $x; $x = 10; #package b; #print $x, "\n"; # パッケージmainの$x #同一ファイル内なら表示可能 b1::printit(); #end ファイル2 b1.pm #実行時エラー #start package b1; use strict; sub printit { print $x, "\n"; #mainパッケージの$xを表示したい # print $main::x , "\n";なら表示可能 } 1; #end
>>892 ド・モルガンの法則って知ってる?
!( $boolean1 || $boolean2 )は( !$boolean1 && !$boolean2 )と等価
!( $boolean1 && $boolean2 )は( !$boolean1 || !$boolean2 )と等価
まあ、「NOR演算子」や「NAND演算子」は用意されてない。
if文に関しての話ならばunlessを使うこともできる。
unless ( $boolean1 || $boolean2 )
unless ( $boolean1 && $boolean2 )
>>893-894 望む効果範囲はどこまでなの?
真のグローバル変数(=mainに細工をすると全てのパッケージから見える)にするのか
特定のモジュール(のour変数。以下同)とmainの変数を共有したいのか
特定のモジュールの特定の変数のみを共有したいのか
それだけ聞いた限りでは凄く変なことをしようとしているように見えるので、
もう一歩引いて何を目的としてそういうことをしようとしてるのか
説明したほうが良い答えが返ってくるかもしれないよ
896 :
893 :2006/12/19(火) 03:38:55
>真のグローバル変数(=mainに細工をすると全てのパッケージから見える)にするのか まさにこれです。 mainパッケージの変数を各種モジュールから自由に読み書きしたいのです。 >それだけ聞いた限りでは凄く変なことをしようとしているように見えるので、 >もう一歩引いて何を目的としてそういうことをしようとしてるのか >説明したほうが良い答えが返ってくるかもしれないよ 元々一つの巨大なファイルのプログラムを分割したいと考えています。 module内からmainパッケージの変数にアクセスするときはmain::として書きたいのですが 元々のファイルが膨大な量なので、全てを変更する事は避けたいです。
897 :
893 :2006/12/19(火) 03:43:44
シンボルテーブルをモジュールごとにインポートすれば mainパッケージの変数を表示できるようになったのですが 簡単な方法が知りたいです。 #ファイル1 use strict; use b1; our $x = 10; b1::printit(); #ファイル2 package b1; use strict; *x = *::x; our $x; sub printit { print $x, "\n"; } 1;
>>896 。oO(それモジュールにする意味あるのかな…) まあそれは置いておいて
とりあえず、Perlには元来グローバル変数は存在しない。
一箇所に仕掛けをしただけでグローバル変数を作るのは、
Perlはdirty hackが色々できる言語だから不可能とまでは言わないが、
かなり邪道な方法になると思う。
擬似グローバル変数を持つ専用のモジュールを作って、
必要な全てのモジュールからimportするってところでどうよ。
## GlobalVariables.pm
package GlobalVariables;
use base Exporter;
our @EXPORT = qw($x);
1;
## main.pl
use GlobalVariables;
use b1;
$x = 10;
b1::printit();
## b1.pm
package b1;
use GlobalVariables;
sub printit { print $x, "\n"; }
1;
こんなモジュールもあった。
http://search.cpan.org/~polettix/vars-global-v0.0.1/lib/vars/global.pm
899 :
デフォルトの名無しさん :2006/12/19(火) 10:49:59
デバイスファイルなど、読み書きするためのオープン方法がよくわからないです。
で?っていう
E*trade証券のポートフォリオにperlで証券番号を登録するスクリプトを作りました。 しかし、該当ページの tmp_web_sec_code に 証券コードを代入し、一件づつしか 登録できない。(どうやっていいのか良くわからない) このページは、画面を見る限りでは、 10件づつ登録できるはずなんだけど、 どうしたらよいのかな? 全銘柄の約4000件登録するのに2時間30分かかりました。 並列処理にして、半分以下の時間に短縮できたけど、効率化できそうなので。。。 perlで使用しているモジュール use Crypt::SSLeay; use LWP::UserAgent; use WWW::Mechanize; 以下の部分を効率化できる? $class->submit_form( form_name=> 'FORM', fields=>{ 'tmp_web_sec_code' => $stock_number, }, button=> 'ACT_insertPfList', );
>>901 それはその何とか証券側のインタフェース仕様がわからないという話なので、こっち側の
プログラムを何で書いたかにはよらない話だからスレ違い。
904 :
899 :2006/12/19(火) 11:42:35
>>900 open( FH, "+</dev/ttyS0" ); を使え、 とか
そういう回答を期待してんだよボケ。市ね。
またか・・・ 学生は冬休みか。
>>895 どうも。
演算子はないんすね。
そっちの法則の方も学校でやったような気はするんですが身についてなかったです。
ありがとうございました。
今の時期に休みなのは、あったとしてもせいぜい北海道の小中学生くらいじゃないかしら?
908 :
デフォルトの名無しさん :2006/12/19(火) 17:24:27
MIME::Parserを使って、メールの本文と添付ファイルを取得するプログラムをPERLで作っているのですが、 ソフトバンクの3D携帯からのメールが来た時、 $MTBody = unmime( $$mail->parts(0)->bodyhandle->as_string ) の所で、 Can't call method "as_string" on an undefined value at ~ なエラーが出ます。解決方法を教えてください。宜しくお願いします。
サポセンかっ!!
as_stringは$$mail->parts(0)->bodyhandleに対するメソッドなので、 $$mail->parts(0)->bodyhandleの返す値がundefだということだな。 なぜそうなってるかを $$mail や元のメールをよく見て調べ、適切に 修正すれば解決するだろう。
ぶっちゃけ板違い。 ここで聞くより、WebProgなりケータイ関連の板で聞くべきだろう。 で、まあ、ついでに聞いておく。 送信したメールに、本文は書かれてるかい?
912 :
デフォルトの名無しさん :2006/12/20(水) 14:36:19
リストファイルからの検索方法に付いて 例えば変換対象の内容を予め用意したリストファイルと照らし合わせ リストファイルの内容と一致した場合にファイルへ出力るすには どうしたら良いでしょうか? 例えばリストファイルが aaa bbb ccc として、変換対象のファイルが aaa test1 abc test2 bbb test3 だった場合は aaa test1とbbb test3の抽出をしたいです。 openや関数を使ってみたけどうまくいかないので誰か教えてください。
どういうことしたいのかよくわからんがこんなんでどう? 動くか試してないけど。 open my $listfh, '<', $listfile or die $!; my @list; while (<$listfh>) { chomp; push @list, qr/$_/; } close $listfh or die $!; open my $convfh, '<', $convertfile or die $!; while (defined(my $l = <$convfh>)) { chomp $l; print "$l\n" if grep {$l =~ $_} @list; } close $convfh;
>>841 ,842
回答されてるじゃん。
回答の意味がわからないなら、「わかりません」「できません」とか言ってからにしろよ
>>912 月曜に全く同じ文章で書き込んだだろ?
回答したんだけどやってみた?
くっそーかぶった結婚しよう
それにしても、ものすごく回答しにくいけど、どうして回答しにくいのかを指摘するのも やはり難しい、そーゆー質問文だよな・・・。 たぶん、リストファイル、リストファイル、ファイルと、同じ言い方で3つの「ファイル」が 文中に登場することと、 「変換」という言葉を使っていながら、その後のディテールには「変換したい」という意志が 見えるところはなく、その象徴のように「抽出」に表現が変わってること、この2点かなぁ。 1) 同じようなものが複数登場するときは、自分から「仮称」をつけて明確に呼び分けておく。 2) ある場所である単語にある概念を託したら、その概念のことは以後必ずその単語で呼ぶ。 それが曖昧な表現ならなおさら、ちょっとでも違う言い方をしたら本人以外は混乱するので。 これを守るだけで、回答者的にすいぶん答えやすくなると思うんだけどね。
でも、この場合は入力例と出力例が書いてあるから、何をしたいかはなんとなくわかるけどね。 それよりも 「openや関数を使ってみたけどうまくいかない」 って文章で、質問者がどれくらい出来てるのかがわかんないよ。 単純にファイルを読み込んでリストを作るくらいは出来てるの?とか。
$a = "1.jpg"; $b = "2.jpg"; $c = "3.jpg"; PerlMagickでこの3枚を使ってアニメーションGIFを作り方が知りたいです $1~$3は同じ大きさなのでリサイズ不要です
PerlMagickの使い方なんてぐぐればすぐ出てくるだろうに・・・
ぐぐって色々やって出来なかったから聞いてます
どうやったか書けばそう思ってくれる人もいるんだけどね
>>922 $image = Image::Magick->new;
$image->[0]->Read($a);
$image->[1]->Read($b);
$image->[2]->Read($c);
$image->Write("output.gif");
とかです。間違ってるようだけど
>>923 本は買う金がありません
変数の付け方からして・・・課題か?
ぐぐったら出てくるだろ・・・
いいから答えて下さい そのためのスレでしょう?
放置決定か
929 :
919 :2006/12/20(水) 16:46:40
$image = Image::Magick->new;
$image->Read($a);
$image->Read($b);
$image->Read($c);
$image->Write("output.gif");
でいけました。後秒間隔を設定したいです
ちなみに
>>927 は自分じゃありません
>>927 そんな言われ方したら普通は答える気が失せるんじゃないだろうか。
ここはID出ない板だから元の質問者が書いているかどうかは不明だが。
>>929 perldoc Image::Magick でマニュアルページ見れば分かるのでは?
933 :
919 :2006/12/20(水) 17:03:23
>>932 ありがとうございます。
$image = Image::Magick->new;
$image->Read($a,$b,$c);
$image->Set(delay=>100);
$image->Write("output.gif");
で解決しました。
>>930 自分じゃありません。
お騒がせしてすいません
早めの埋めだと思っておいてください
お前が言うな
IDでる板ならいいのに。
936 :
デフォルトの名無しさん :2006/12/20(水) 18:03:37
そうですね
教えてほしいんだけど。 open my $fh, '>', 'hoge.dat'; こういう風にファイルを開いたときに、$fhからファイル名をしることってできる? この例ならhoge.datが帰ってきてほしい。
こんばんは 引数に配列・ハッシュ・リファレンスのいずれかを受け取るサブルーチンを用意するのですが、 与えられた引数が配列とハッシュのどちらかであるか判別する方法はありませんか? リファレンスを受け取る場合は !$#_ && ref($_[0]) で判別できるのですが、 @_%2 では引数が偶数個だった場合配列とハッシュを区別できません。 exists(${¥%{{@_}}}{keyname}) では引数の偶数番目にkeynameが含まれる配列をハッシュと誤ってしまいます。
>>937 直接に知る方法はない。statすればデバイスとinode番号がわかるから
必死でfindすればわかる可能性はあるが、既にunlinkされててみつからな
かったり、リンクがあって複数候補がでて特定できなかったりするかも
しれない。
>>938 こんなじゃだめなの?
$LIST = [1,2,3];
$HASH = {1 => 2, 3 => 4};
if ($LIST =~ /^ARRA/)
{print "LISTn"}
elsif ($LIST =~ /^HASH/)
{print "HASHn"}
それリファレンスじゃん
>>938 特にプロトタイプを指定していない関数の場合、引数はリストコンテキストで評価されます。
配列もハッシュもリストコンテキストではただのリストに変換されます。
('A', 123, 'B', 456, 'C', 789)
↑これが元は配列だったのかハッシュだったのかなんて、判断のしようがないでしょう?
リファレンスで渡してやればいいべ
>>941 ああ、配列のリファレンスかハッシュのリファレンスかの判断かと思ったよ。
全部リファレンスに置き換えてサブルーチンに渡すか、
設計そのものを見直した方がいいんじゃない。
確実に意図通り渡すにはリファレンスを用いる外にないということですね。 ありがとうございました
>946 言われて見直してみたら吹きかけたじゃねーか
('A');
continueはforeach文でも使えますか?
つ wantarray ・・・ってだめじゃん(呆) ♪This function should have been named wantlist() instead. だったらさっさと作れば。。。
>>949 Perl には continue なんてありませんが、next なら使えます。
>952 待て。ちょっと待て。
あー ループブロックの後ろに付ける continue ブロックってあったねそういえば orzz あんまり使わないし見ないので忘れてた(´・ω・)
957 :
937 :2006/12/20(水) 23:41:42
>939 ありがとう。じゃああきらめて別の書き方しよう。
>>937 開いたファイル名を何がしかの形で保存しておくだけで実現すると思うんだけれど。
取り出せないファイル名でファイルを open するというのは、少なくともぼくはやったことがないので。
それでもちゃんと CPAN には、
FileHandle::Deluxe
による文字列化機能があります。
959 :
937 :2006/12/21(木) 01:11:38
>958 うわ、ありがとう。 インターフェース的に、ファイルハンドルだけ渡したほうが すっきりするような状態になってたからすごく助かる。
$x、$y、$zを大きい順に並び替える場合 どうすればよいのでしょうか?
配列に突っ込んでソート
962 :
960 :2006/12/21(木) 19:40:20
ソートの方法がわからないのですが・・・
ココってperl初心者スレだっけ?
965 :
960 :2006/12/21(木) 19:47:13
できればソートを使わずに、配列で表示させたいです。
使えよwwww
967 :
960 :2006/12/21(木) 19:49:04
やはり使わないと不可能でしょうか?
968 :
966 :2006/12/21(木) 19:52:05
すまん言い方が悪かった。なんかウケてしまったw ソートってのは並び替える関数だから覚えると便利だよ リストと配列の違いも調べるといいよ sort使わずに、っていう条件なら住人の食いつきもいいかも。
969 :
960 :2006/12/21(木) 19:53:42
>>968 sort使わずにの条件でお願いします。
なんで?理由は?
比較演算子とかifとか知らないのかな
どう考えてもこれで十分だろ。 ($x, $y, $z) = sort { $b <=> $a } ($x, $y, $z);
sortを使わないとなると、if文やリスト、配列を使うのでしょうか?
>>973 変数3個なら並び方は順列で6通りだから if~elsif 文でなんとかなるだろ
$i = @nums = ( $x, $y, $z ); foreach (0 .. $i) { foreach (0 .. @nums) { @nums[ $_, $_ + 1 ] = @nums[ $_ + 1, $_ ] if $nums[$_] < $nums[ $_ + 1 ]; } unshift @sorted, pop @nums; } sort() を使わないと、こんな愉快なコードを保守する破目になりますが、かまいませんか?
それは変数三つに対して大仰だろう if ($x < $y) { ($x, $y) = ($y, $x) } if ($y < $z) { ($y, $z) = ($z, $y) } if ($x < $z) { ($x, $z) = ($z, $x) }
って順番間違えたorz 正しくはこうだ if ($x < $y) { ($x, $y) = ($y, $x) } if ($x < $z) { ($x, $z) = ($z, $x) } if ($y < $z) { ($y, $z) = ($z, $y) }
980 :
960 :2006/12/21(木) 21:05:54
@a=($a=10,$b=5,$c=30); if($a<$b){ ($a,$b)=($b,$a) } elsif($a<$c){ ($a,$c)=($c,$a) } elsif($b<$c){ ($b,$c)=($c,$b) } print $a $b $c xyzをabcに変えました。 これでできません・・・どうしたらよいのでしょうか?
981 :
960 :2006/12/21(木) 21:27:49
教えてくれるほどの技術の人が居ないようなので 別のところで質問することにします。 さようなら
982 :
960 :2006/12/21(木) 21:29:31
>>980 自分で$x,$,$zで質問して、なぜ$a,$b,$cに代えるの?
無知なフリして無駄に時間を使わせないで下さい
しかもつまらないし
皆さんも、親切なだけではなく、ガマン強いですね
もう相手にするのはやめては?
>>980 上のほうで if (条件) { ブロック } を3つ並べる例を出してもらってるのに
if~elsif~elsif~に動作変えちゃったのはなぜ?
つーか、sort で…というのを踏まえて $a $b を使う方向に変えたのかなあ。
985 :
960 :2006/12/21(木) 21:44:48
($x=10,$y=100,$z=30); if ($x < $y) { ($x, $y) = ($y, $x) } if ($x < $z) { ($x, $z) = ($z, $x) } if ($y < $z){ ($y, $z) = ($z, $y) } print "$x,$y,$z"; でやったらできました。 しかしifの中がいまいちわかりません。。
>>979 そうだ、プログラマは無精であるべきだったな。
対象が増えることを予期するべきだった。私とした事が。
罰として久しぶりに次スレ建ててくる。
どうしてsortを使わないのかいまいち分かりません。。 本当は分かるけど。課題なんだろ。
>>986 はスレ立てを蹴られたのか、テンプレの準備がなかなか進まないのか。
ごめん、蹴られて別回線使おうとしてたところだけど駄目だった。
990 :
988 :2006/12/21(木) 22:33:59
俺も蹴られたらどうしよう?と思いながら逝ってくる。
991 :
デフォルトの名無しさん :2006/12/21(木) 22:38:00
992 :
デフォルトの名無しさん :2006/12/21(木) 22:41:52
うめ
993 :
デフォルトの名無しさん :2006/12/21(木) 22:42:02
うめ
994 :
デフォルトの名無しさん :2006/12/21(木) 22:42:17
うめ
995 :
デフォルトの名無しさん :2006/12/21(木) 22:42:54
うめ
996 :
デフォルトの名無しさん :2006/12/21(木) 22:43:29
うめ
997 :
デフォルトの名無しさん :2006/12/21(木) 22:43:35
うめ
$s = q{$self->kakikomi(qq{\$s = q{$s};\n$s\n__END__\n埋め})}; $self->kakikomi(qq{\$s = q{$s};\n$s\n__END__\n埋め}); __END__ 埋め
999 :
デフォルトの名無しさん :2006/12/21(木) 22:43:50
うはww
1000 :
デフォルトの名無しさん :2006/12/21(木) 22:44:10
1000なら彼女できる
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。