"The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板
http://pc8.2ch.net/php/ )
CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
http://www.perl.org/get.html ● 2006/06/02現在の最新版: 5.8.8
● 2006/06/02現在の開発版: 5.9.3
リンク集は
>>2-3 過去スレは
>>4
乙
6 :
デフォルトの名無しさん :2006/06/03(土) 00:16:38
タモリ倶楽部が始まった
>>1 乙。つかありがとう。普通に気づいてなかった。
useについて質問です。 a.plとb.pmという二つのファイルは同じディレクトリにあります。 #--a.pl-- use b; printString(); #--b.pm-- package b; sub printString(){ print "aaa"; } sub import() { *{"main::printString"} = \&printString; } 1; この状態でa.plを実行すると &main::printStringサブルーチンが見つからないとエラーになります。 どこか間違っていますか?
11 :
9 :2006/06/03(土) 09:16:55
>>10 use bなのにBが読み込まれちゃうんですね。
ありがとうございます。すっきり解決しました。
おっしゃる通り練習です。
続・初めてのPerlってのに載っていたimportの
練習でした。
だから "a" と "b" はまずいとあれほど……
"c"以降は問題ないのけ?
O.pm ってのもあるし……
am.pm ってのもあるな
前スレ
>>998 >Rubyに完全に取って代わられちゃったね。
>正確に言えば、まともなプログラマはみんなRubyに流れちゃって、
>自分が書いたコードの効率もろくに把握できていないようなアホだけが
>未だにぶら下がっている・・・っていう、ある意味過疎より酷い惨状だけど。
>>999 >>998 >3年前の状況としてなら賛成。
この頃ruby基地からのアラシが少なくなったと思ったらまた出たか。
漏れはPerlの方が速いし、モジュールが充実してるからPerl使ってる。
>>16 おまえも荒らしに加担してるのわかってんだろうな?
>>17 お前も俺もな。
遠巻きに眺めながらそっとしておいてあげるのが最高のスルーション。
前スレ 974 氏 解決済みだろけど書いてみた。 print do { local $/ ; <> } =~ /.*?(([^¥n]*?¥n){1000})¥Z/ ; 一行だ。
さあ華麗にスルーして、話題を強制的に質問と回答に戻そう。
前スレ
>>988 | 988 名前:デフォルトの名無しさん:2006/06/03(土) 00:29:18
| Template Toolkitで使用する
| テンプレートファイルをうまくデバッグする方法はありませんか。
|
| テンプレートに誤りがあるときのエラーメッセージ
| は決まって "Bad file descriptor at ..."であり、
| テンプレート修正の手がかりになりません。
TT使ったこと無いんだけど、簡単なのを書いてみてもエラーの箇所が表示されるし、
モジュール内を検索してもそのエラーメッセージが出てこなかった。
再現用のサンプルを出して貰えると使ったことの無い人でも調べて回答できるかも。
と思ったら 1000 行以下がでないじゃん。 my $data = join '', <> ; $data =~ s/.*?(([^¥n]*?¥n){50})¥Z/$1/s ; print $data ;
>>21 >print do { local $/ ; <> } =~ /.*?(([^¥n]*?¥n){1000})¥Z/ ;
{1000} を{1,1000} にすりゃいい話だ罠。
$list = qw(0 1 2)[2]; これって無名配列なの?
>>23 それは単なるリスト(のスライス)
リスト=スカラーコンテキストでは最後の要素を返す
配列=スカラーコンテキストでは要素数を返す
ということで、一応区別はある。
ちなみに無名配列そのものをその場でつくることは出来ないが、あえて書くなら
@{[0, 1, 2]}/${[0, 1, 2]}[0]とか、こんな感じでつくることは出来る。まぁ、リストがあれば事足りるのでする価値はないが。
25 :
23 :2006/06/03(土) 15:33:58
そっかリストと配列は違うものなんだね ありがとうございます
ttp://search.cpan.org/~nwclark/perl-5.8.8/pod/perlglossary.pod#anonymous | Anonymous
無名(匿名)
| Used to describe a "referent" that is not directly accessible through a named "variable".
名前付けられた変数を通して直接的にアクセスできない指示物(=リファレンスの指す物)を言います。
| Such a referent must be indirectly accessible through at least one "hard reference".
そのような指示物は一つ以上のハードリファレンスを通して非直接的にアクセスしなければなりません。
| When the last hard reference goes away, the anonymous referent is destroyed without pity.
最後のハードリファレンスが消えたときに、無名の指示物は容赦なく消されます。
って所か?訳の正確性はまったく保障しないが
うほっ、名前間違えた…('A`)
>>24 知らなかった。
sub s1 {
return qw(a b c);
}
sub s2 {
return my @x=qw(a b c);
}
sub s3 {
my @x=qw(a b c);
return @x[0..$#x];
}
とすると、scalar &s1 は c , scalar &s2 が 3 , scalar &s3 が c なのか。
戻り値のリストと配列は、意識の片隅に入れておいた方が良いのかも。
>>28 どういった時にそんな使い方するのか
片隅に入れるならwantarray
30 :
デフォルトの名無しさん :2006/06/03(土) 17:43:42
ふたつのふぁいるをひらいてそれぞれのぎょうをひかくしてじょうけんがあえばあたらしいふぁいるにそのぎょうをかこうしたものをかきこんでいくばあい whileをいれこにしてやってるんですがもっとこうりつてきなものはありますか?
ねーよw
Template Toolkitで使用する テンプレートファイルをうまくデバッグする方法はありませんか。 テンプレートに誤りがあるときのエラーメッセージ は決まって "Bad file descriptor at ..."であり、 テンプレート修正の手がかりになりません。
答え=ヒントありましたね。二重質問失礼しました。
34 :
デフォルトの名無しさん :2006/06/03(土) 18:08:45
これからラーメン食べに行きます。
35 :
デフォルトの名無しさん :2006/06/03(土) 18:29:41
>>32 これってはてなで全く同じ質問を見たんだけど……
本人? 回答予定者?
>>30 釣りだろうけど暇だから書く。
>ふたつのふぁいるをひらいてそれぞれのぎょうをひかくして
ここから判断して二つのファイルの行数は一緒。
my @one ; # 一つ目のファイルの中身
my @two ; # 二つ目のファイルの中身
for ( my $i = 0 ; $i <= $#one ; $i ++ ){
# $one[$i] と $two[$i] を比較しろ!
}
37 :
デフォルトの名無しさん :2006/06/03(土) 19:00:52
っていうかよ、ファイルが馬鹿でかかったらどうすんだ?
片方をハシュキーにしたいよなぁ。 でも巨大なファイルだとあぼーんしちゃいそう。。。
内容をMD5にしちゃうと、ちょっとはマシかな? # キー作成 my $MD5_value = Digest::MD5->new; my %hash = map { $MD5_value->add($_); ($MD5_value->hexdigest, 1) } <FH>; みたいなみたいな。。。
あ、これじゃ値がおかしゅくなるか(哀) my %hash = map { my $MD5_key = $MD5_value; $MD5_key->add($_); ($MD5_value->hexdigest, 1) } <FH>; もちょっと最適化できそうな。。。
最初の質間者が臣大ファイルを相手にしてるとは思えないが、
俺だったら
1.コマンドのsplitかまして、それぞれに
>>36 2.素直に両方のファイルをseekして、それに
>>36 を適用
する。むろん検索ミスがおこらない様にポインタをずらしながら。
行が合ってないとかだったら「条件」によって変わるなあ。
42 :
デフォルトの名無しさん :2006/06/03(土) 20:49:29
物理とかの分野だとやたらと巨大なファイルが出来上がるものもあるので、 一発読み込みは危険。 同じデータを違うソフトで使いまわすときもあるので、同じ行番号って縛りはなくしたほうがいいな。
>30の言うとおりに書くと、 open (my $in1,'file1') or die open (my $in2,'file2') or die open (my $out,'>result') or die; while (defined(my $val_1=<$in1>){ my $val_2=<$in2>; if (比較条件($val_1,$val_2)){ print $out 加工($val_1,$val_2); } } となって、どこでwhileが入れ子になるのかわからんのだが.... いつの間にか、同一かどうかを比較する話になっているが、 2つのファイルの各行の比較というと、 $val_1 > $val_2 といった条件もあるわけですよね? もし、同一かどうかを比較するなら、open (my $in ,"diff $file1 $file2|") とやる方法もある。
エスパーだらけだな
46 :
デフォルトの名無しさん :2006/06/03(土) 21:30:26
perlで\nを検索する正規表現ってどうしたらいい?
/\n/s
48 :
デフォルトの名無しさん :2006/06/03(土) 21:39:18
>>47 ありがとう。
\nという文字そのものを検索するにはどしたらいい?
\\n
>>42 Bio分野の者だが。
500Mbくらいのテキストだったら平気でまる飲みさせて
るしまる飲みできるぞ。undef $/; して。
1Gを越えた時はさすがにseekしたが。
そんなに何千万行ものデータが出るのか?物理分野って。
#perli.5.005時代はもちろんまる飲みなんてさせてません。
51 :
デフォルトの名無しさん :2006/06/03(土) 21:45:12
>>49 ありがとう。
最後に空行にみえてしまう行を検索するにはどうしたらいいですか?
空行を検索するのはできるんですが。
sorry, this 2ch is japanese only.
54 :
デフォルトの名無しさん :2006/06/03(土) 21:54:55
ごめん。質問訂正いたします。 目でみると実際は空行に見えるが、tabが入っていて 実は空行ではない。のを検索するにはどうしたらいいですか? その他の空行ではない行でtabが入っていても無視する。 というものです。
>>54 その質問はここでしていい質問じゃない。帰れ。
^\s+$
>>58 なぜ54にレス?
にしても500メガPerlで生で読めるPCって個人で持ってるの?
うちの研究室じゃPCに回す予算なんてないから、メモリ増設したい奴は自費でやれ、だよ。
61 :
54 :2006/06/03(土) 22:06:27
タブを検索するのは簡単なんですが、 空行に隠れるタブのみを検索したいんです。
>>60 レスみすったw
うちは「メモリは消耗品予算で買えるからOK。PCは予算がない!」
てんで5年前のMacに積めるだけのメモリを積んでますw
>>44 どーしても突っ込みたくなった。
my $val_2=<$in2>;
file2は先頭行しか見ないのか?
>>63 なんで?file1のwhileループが回ってる間、一行ずつfile2からも引いてると思うが
>63 <FH>の意味と使い方を調べてごらん。
66 :
63 :2006/06/03(土) 22:43:33
…吊ってくるorz…
CGI::Prettyを使って、ちょっと大きめのテーブルを表示し ようとしたんです。 32文字ぐらい *16列 * 4098行 = 2M 程度。 メモリは2ギガ積んでいます。 しかし、実行するとメモリの使用率がガンガン上がって いって止まってしまうんです。 use CGI::Pretty をコメントアウトすると問題ありません。 テーブルのサイズが小さいときは問題ありません。 なぜでしょう? CGI::Pretty は使わないほうが速いというのはわかるんです が、使わないと、HTMLソースがすごく見にくいので、できれ ば使いたいんです。 CGI::Pretty って\tと\nを入れているだけにしか見えないの ですが、そんなにメモリを使用するものなのでしょうか? Windows,Linuxどちらでも、以下のスクリプトでも再現しました。 use strict; use CGI qw(:standard); use CGI::Pretty; my @trs; my @tds=qw(0 1 2 3 4 5 6 7 8 9 a b c d e f); push @trs,td({bgcolor=>'#FFFFFF'}, \@tds) for (0..4097); print table(Tr \@trs); どこが問題なのでしょう?
WebProg板に行かないところ
>>67 はブラクラ。
試したら、サーバがswapし始めて、応答しなくなった。
それはブラクラと言わないような…
>>67 ヒント:header,start_html
IEは巨大なテーブルの表示に時間がかかる。 これはperlでなく、IEの問題。 そのスクリプトをtest.plという名前で保存して perl test.pl >test.html ってやってごらん。 perlの処理にはそんなにかかっていないはず。
74 :
73 :2006/06/04(日) 01:42:18
スマソ。 試したら、perlの処理の問題でした。 IEの問題ってのは忘れてください。
ぬるぽ
やっぱりbe付けてる人は荒らしてばっかりだね。
openするときの引数は''と""""の どちらで囲んだ方が速いかなと思い 以下のベンチを取ったのですが use strict; use Benchamark; timethese(100000, { TEST1=>'\sub1', TEST2=>'\sub2'}); sub1 { open my $fh, "<", "test.txt"; } sub2 { open my $fh, '<', 'test.txt'; } テスト結果が表示された直後 Can't call method "sub2" without a package or object reference at となってしまいます。ちゃんとsub2をリファレンス渡ししてるのになんで・・・ 一応テストはうまくいっているようなのですが どこがおかしいですか?
80 :
79 :2006/06/04(日) 09:49:34
ああ、死んできます
Benchmark: timing 100000 iterations of TEST1, TEST2... TEST1: 27 wallclock secs ( 7.73 usr + 16.20 sys = 23.93 CPU) @ 4178.16/s (n =100000) TEST2: 28 wallclock secs ( 8.01 usr + 15.89 sys = 23.90 CPU) @ 4183.23/s (n =100000) Bechmarkの結果についてなのですが、 上記のようなBenchmarkの結果はどちらが速いのでしょうか? wallclockのところを見るとTEST1の方が速いように思いますが 消費したCPU時間を見てみるとTEST2の方が少ないようです あと、@以降の部分は一秒間に回ったループの回数ですよね? ということはTEST2の方が速いということなのでしょうか? いったいどれを見たらよいのでしょうか・・・
前スレで誰かが use encodingはメンテナも推奨していない と言ってましたが詳しく教えてください 今までjcodeとかでちくちくやっていたのを (特にwinな環境なので) ソースの最初にuse encoding 'sjis'; とするだけで漢字を含んだ正規表現も幸せ に出来ていたので不安になってしまいました 確かソースをeuc-jpに統一しても日本語を含んだ 正規表現に関しては多くの問題は解決するけど 完璧には動かないんですよね? それをencodingで解決できたと思っていたんですが それがだめだとすると一体perlでの日本語処理は どうすればよいのでしょうか?
84 :
67 :2006/06/04(日) 10:34:13
板違いすみませんでした。 WebProg板に行ってきます。 同じ質問を違う板に書いても、この場合はマルチじゃないですよね?
>>67 CGI::Prettyの_prettyPrintというサブルーチンは、@CGI::Pretty::AS_ISにある
タグの間以外はインデントを追加する、という単純な動作なようだが、
かなり効率が悪いアルゴリズムになっている。
@CGI::Pretty::AS_ISに含まれるタグの対で文字列を前半分と後ろ半分に
わけてそれぞれ再帰してインデントつけたのを最後にくっつけるわけだが、
AS_ISに<td>..</td>が含まれているので、<td>の出現数分再帰し、
なおかつ途中経過の文字列が全部スタックに詰まれるので<td>の
数の2乗に比例した計算時間とメモリが使われる。
アルゴリズムを直してもらうかあきらめるかじゃないだろうか。
package hoge; use strict; と書くのと use strict; package hoge; と書くのは何か違いがあるのでしょうか?
>>82 use encodingで起こりうる問題を把握して使っていれば問題ないと思うよ。
分かってないとハマる可能性があるから、使わなくて済むなら使わないほうがいいってこと。
>>83 の人も言ってるように、ソースはutf8で書いて、
入出力時にcp932その他に変換したほうが望ましいと思います。
ついでに言うと、Windowsでsjisを使うのはやめたほうがいいよ。
>>86 はい、違いがあります。
strict プラグマはレキシカルスコープで効きます。
従って use strict; よりも前に書かれた package 宣言は strict によるチェックを受けません。
しかし、package 宣言において厳格さのチェックが必要になるケースはほとんどないのでこれが問題になることは稀です。
実際モジュールなどでは大抵、可読性のためにほとんどのコードに先んじて package 宣言を行うのが半ば慣例化しています。
通常はこの慣例に従うのが良いでしょう。
>>87 > ついでに言うと、Windowsでsjisを使うのはやめたほうがいいよ。
Mac なら問題ありませんか?
>>88 どうもありがとうございます。
ところでpackage宣言でstrictを要する場合ってほとんどないにしても
何かあるわけですか?さっぱり思いつかないんですが
どういう場合があるか教えてもらえませんか?
>>87 どうもありがとう
そのuse encodingで起こり得る問題について
詳しく教えてもらえませんか?
あとWinでは入出力時にsjisではなくてcp932
を使えとのことですが、この二つって同じもの
じゃないのですか?どこが違うのですか?
92 :
88 :2006/06/04(日) 14:22:11
>>90 ちょっと考えて、思いつかないことに気付いて笑っちゃった。w
うん、たぶんないね。ありがとう。軽く吊ってくるわ。
>>91 一番大きな問題は encoding の効きが「グローバル過ぎる」こと。
use encoding; したスクリプトから呼び出されたモジュールの類にも見境無しに効く。
依存関係のどこかで、これが問題になるようなコードがあれば、その挙動の予測ができない。
cp932 については文字コード関係の文書をあたってみて。
要するに「両者が完全には一致していない」ということ。
>>81 比べるべきはTotalだが、ほとんど有意差はみられない。
トリップを生成するプログラムを作っているんですが、 2chで#アだとtsGpSwX8mo 自分の環境でトリップキーがアだとIApAHNvIKg になります。なぜかトリップキーが2文字以上あればうまくいきます。 「あ」も「a」もだめでした。 ActivePerl5.8.8 Build 817です。 プログラム内容は $tripkey="ア"; $salt = substr($tripkey.'HG', 1, 2); $salt =~ tr/:;<=>?\@[\\]^_`/ABCDEFGabcdef/; $salt =~ tr/\x80-\xFF/\x00-\x7F/; $salt =~ tr/\x7B-\x7F/\x2e-\x32/; $salt =~ tr/\x14-\x2D/\x61-\x7A/; $salt =~ tr/\x00-\x13/\x47-\x5A/; $trip = substr(crypt($tripkey, $salt), -10); print $trip; です。 何故でしょうか?どのようにしたら2chと同じトリップが出せるのでしょうか?
ハードゲイじゃなくてH.
97 :
95 :2006/06/04(日) 18:26:36
>>96 ありがとうございます。うまくいきました。
98 :
デフォルトの名無しさん :2006/06/04(日) 20:03:25
サブルーチンの引数にハッシュを渡すことは可能ですか? &foo(%hash); sub foo { %hash = $_[0]; print join "\n", keys %hash } とやってみたのですが、うまくいかないようです。
サブルーチンの引数に配列を渡すことは可能ですか? &foo(@array); sub foo { @array = $_[0]; print join "\n", @array } とやってみたのですが、うまくいかないようです。
釣りだよね。 じゃなかったら本を読もうね。
サブルーチンの引数にスカラーを渡すことは可能ですか? &foo($scalar); sub foo { $scalar = $_[0]; print $scalar } とやってみたのですが、うまくいきました。 どう見ても釣りです。本当にありがとうございました
つまんね
my %hash = @_; うぇ
106 :
デフォルトの名無しさん :2006/06/04(日) 21:36:21
>>104 ありがとうございます。
わざわざ、
&foo(\%hash);
sub foo {
%hash = %{$_[0]};
print join "\n", keys %hash
}
なんてやってましたorz
>>106 処理がそれだけなら、次のようにも書けるよ。
print &foo(\%hash);
sub foo { join "\n", keys %{ +shift } }
# サブルーチンで値を返すようにして、呼び出し側で print してるのは単に僕の好みだから気にしないで。
>>106 すごい。
そこまでできる技術があるのに・・・
どうでもいいけどmy使おうね。ついでに、サブルーチン引数は名前をつけるという意味でも以下のようにしたほうがいい。 sub foo{ my($first, $second, @other) = @_; # ... } foo(1, 3, 4 .. 10);
111 :
デフォルトの名無しさん :2006/06/04(日) 22:43:57
配列の$_[0]から$[5]までの変数に文字列が入っていなければ、 何かの処理をするような、エレガントな記述を記述を教えてください。 今はこうする方法しか考えつきません。 $flag=1; for ($i=0;$i<6;$i++) { if ($_[$i] ne '') { $flag=0; } } if ($flag) { [何かの処理]; } よろしくお願いします。
if ( grep /.+/ @_ ) {処理} でおk my @flag = grep /.+/ @_; とかすると@flagには空でない値が全部はいる。
>>111 if (scalar(grep /\w/, @_) == scalar @_){
# 処理
}
かな?
>>113 ちょとちがうか(照)
unless (scalar(grep /\w/, @_[0..5])){
# 処理
}
かな?
joinでええやん
んじゃ join if ('' eq join('', @_[0 .. 5])) { } つーか、そんな6つも引数渡すような関数作の方を 考え直した方が良いと思うけど
あえてひねくれる。 %hash = map{ $_,1 }@_ if( defined $hash{''}){ #処理 }
119 :
111 :2006/06/04(日) 23:54:38
もう少し考え直したほうが良いほうです。 でも、参考になりました。 ありがとうございました。
2ちゃんのbbs.cgiは引数を8個渡しているそうです
>>116 grepの結果はリストなのでifではスカラコンテキストで評価されて真値を返すのでは?
試してないが
>>112 で通ると思われ。
>>112 =121だが元投稿をよく読んでなかったw
配列に空文字列を一つでも含む場合に処理をするんだな。
if ( ( grep /.+/ @_ ) < @_ ) {処理}
か
unless ( ( grep /.+/ @_ ) == @_ ) {処理}
でよくね?
添え字が0-5の6個だと分かってるなら
if ( ( grep /.+/ @_ ) < 6 ) {処理}
とか。()付けたから@_ = qw( 0 );でも通るはずだぞ。
>>108 いや、必死にマニュアル読みましたよ。
釣りじゃないです。。
>>110 ここにあげる例として書いただけで、実際のコードには my を仕様しております。
6個程度の配列ならgrepでいいけどそれが嫌いなら sub hoge { 処理 } foreach (@_) { length $_ or hoge() and last; } ですっきりするし無駄な評価を避けることが出来る。 ただしhogeは真値を返せよ。
誰もが考えフいて誰も書かなかっただけじやない? >工レガント っていってるし。
>>117 の書き方って正しいの?
なんで" eq join("なんてなってんの?
おかしくない?
>>126 " eq join(", @_[0 .. 5])
>>117 '' eq join('', @_[0 .. 5])
129 :
128 :2006/06/05(月) 08:33:19
いや、全く逆で俺の勘違いだった。すまん。
>>125 / || :ヽ
┌|(⌒ヽ :|| ..:⌒: |┐ / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|::|::ヽ.__:):||(___ノ ::|::| │
|:|: .. :|| .. |:| │
:|: .. || ..|| < ジュワ!(やっぱりウルトラマン語で頼む
:\ [_ ̄] /::| │
:: |\|_|_|_|_/:::| \________
__| | / / :|___
for(my $i=0;$i<6;$i++){ unless($_[$i]){ {処理} } }
133 :
132 :2006/06/05(月) 14:26:01
もし配列要素へのインデクスがいらないなら。 map{ {処理} unless $_;} @_[0..5]; たとえば、空要素の位地に特定の文字列をセットするようなときには使える。 map{ $_='N/A' unless $_;} @_[0..5]; 空要素だった時に条件成立なら、要素の値を取得しても意味が無い。 だって空だから。
>>127 あそっかダブルコーテーションじゃなくてシングルコーテーションだったのね
もういやぽ
135 :
132 :2006/06/05(月) 14:31:56
俺も勘違いだ。orz
>>111 のコード紛らわしス。
>>111 if ( grep /^$/, @_[0..5] ) {
# 何だか知らんが何かやっとけ
};
>>136 それじゃあ1つだけでも空の文字列があればtrueにならね?
unless ( grep !/^$/, @_[0..5] ) { }
とか
if ( grep(/^$/, @_[0..5]) == 6 ) { }
とかならわかるけど。
138 :
136 :2006/06/05(月) 21:43:15
>>137 ありがと。
いや笑った笑った。こりゃ混乱するわな。w
use List::MoreUtils qw(all); if (all {$_ ne ''} @_[0..5]) { } モジュールに頼るのがエレガントかというと意見が分れると思うがソースとしては美しくなると思う
>>111 なんか盛り上がってるから読んでみた。インデントが少し変だと思った。
ちなみに俺は、自分用のコードを書く場合必ず my_func.pm ってのを使ってて
その中に「全てが真であるか調べる関数」と「全てが偽であるか調べる関数」が存在してる。
141 :
140 :2006/06/06(火) 02:57:59
ところで、ホントすんません。 久しぶりに自分の昔のメモ見たら、 #▼全て偽なら真が返るが、分かりにくく汚め。 ($aaa . $bbb . $ccc . $ddd) + 0 ? 0 : 1; ってゆうのが出てきたんですが、+0って何を考えて+0したんでしょうか?俺は。。。。 なんか思い出せません。orz 数値コンテキストを適用したいっぽいのは想像できるんですけど、なんで数値コンテキストなんでしょうか? 昔のほうの俺が何かアホな勘違いをしたんでしょうか?脳が衰えて判断できない。。。。
142 :
140 :2006/06/06(火) 03:00:31
あ、書き込んだ瞬間気付きました。 変数の中が0なら0000になって文字列で真になっちゃうってコトかな (恥)
!($aaa || $bbb || $ccc || $ddd);
>>141 は「全て偽なら真を返す」だけど、「!(全て偽)なら!(真)を返す」ではないね。
例えば、連結後の文字列が '123.45e-06789' になる場合とか。
>>141 のは変数が全部数値なときしか使えないじゃんか
変数のどれかが一個でも文字列だったら
+0で数値コンテキストで評価されちゃって0と評価されるから
意図した結果にならない
ファイルから1バイトずつ読み出したいんですが while ( read ( FP , $x , 1 ) ) { 処理本体 ; } でいいんでしょうか
すんません自己解決しました。 getcっていう便利な関数があるんですね
local $/ = ¥1 つー手も。
1バイトの2進数が変数に入っている場合に(数字キャラクタで入っているのではなく、 8ビットのビット列がそのまま変数に入っているとして)、それを数字キャラクタで表された 0b00101101というような形に変換して別の変数に格納したいんですが、 そういう仕事をしてくれる関数ってありますか?
unpack?
unpackでググってやり方がわかりました。 どうもありがとうございますた
ラクダ本にgetcは使うなって書いてあるんですが 理由が書いてありません どういう理由なのでしょうか?
OSによる行バッファリングが入っちゃうからじゃないかな
>>152 Perlでは一文字づつ処理しなければならないケースが極端に少ないため、
C的な感覚でのgetc()の使用は、ほとんどの場合もっとずっと簡単な正規表現での処理に置き換えられる。
したがって、getc()でなければならないという強い確信があるとき以外は使わないほうがいい。
という程度のことだと思うよ。
実際、俺は使ったことないし、使ってるコードを見たこともない。
155 :
152 :2006/06/07(水) 07:28:51
>>153 どうもです。行バッファリングって具体的にどういう?
>>154 さんくすです。ということは行バッファリングどうこうって関係ないのね。
>>155 まあ落ち着け。
入力ストリームから一文字入ってくるたびに何か処理を行いたいのに、一行分貯まるまで渡ってこないと困るケースがあるとは考えないか?
while (my $oee = <$fh>) { } これってループ毎に$oeeはいちいちmy宣言されてしまうから my $oee; while ($oee = <$fh>) { } とした方がいいですか?
>>156 そんなケースってあるの?
例示してくれ
parでつくったguiあぷり。 コンパイルしたディレクトリだとアイコンが表示されるけど、 違うディレクトリに移動するとアイコンが表示されない。 (ファイル自体のアイコンだけは問題ない!) 他の部分は、ウィンドウズのアイコンになる。 IconResetで内部無理矢理変えても駄目だなあ。 なんで?
>>157 とても古いperlを使うなら Yes
そうでないなら、廃人にとっては Yes かもしれないが、通常は No
例えば、整数値のみを保持しているスカラ変数を文字列中で展開すると
整数値以外に文字列値も持ったり、数値演算を行うとdouble値も持ったり
する事を気にするような場合は Yes かもしれない。
後は、こんな...
perl -e "while(my $x=<STDIN>) {printf '%08x %3d %3d',unpack('lll',unpack('P12',unpack('P4',pack('l',\$x))));}"
真似が普通の人にとっても Yes かも
my(やlocal)の実行時効果は
・ブロック内で最初の実行
ブロックから抜ける時の変数回復情報に、変数情報と変数実体を登録する
新しい変数実体を確保・初期化する
・それ以外
古い実体のリファレンスカウントを減らす
(リファレンスカウントが0になったら開放される)
新しい変数実体を確保・初期化する
(高い確率で同じ実体が再利用される)
だから、負荷自体はかかるけどね。
大雑把に、ループ中のmy(やlocal)は「my変数はlocal変数より速い」と同じ
程度の差でしかないから、読みやすさを優先した方がいい。
>>158 そう来たか。w いや、なんでも疑問を持ってみるのはいいことだ。
ひとつ最も端的な例を挙げるとするなら、端末からのユーザ入力ということになる。
# 普段の I/O でバッファリングなどを意識しなくていいというのは言語の成果なんだろうね。
# 十年後にはこういう話題の価値ってなくなってるんだろうなあ。うん、そのほうがいい。
perlでインタラクティブなことをするのってバカらしいしな。 というかコンソールツールで。
昔、Term::Readline 入れて作らされたなあ。 自分のためのスクリプトだったらそんなことしないのに。
getcは便利だよ
>>164 大丈夫だ。そこは誰も否定してない。w
移植性や保守性、実行時効率などを考慮すると、いろいろ面倒だから気をつけれ、という話だ。
if ( $isDoorOpen ) { goUp($MAX); }
$height += 100 unless int rand 10;
Win32::API について質問です。 Win32::APIで呼び出せるdllの呼び出し規約は何なのでしょうか?
現在時刻をミリ秒まで拾える方法があれば教えてください。
Time::HiRes
172 :
168 :2006/06/10(土) 00:30:10
>>171 ありがとうございます。
WINAPI = stdcallであることを確認できました.
最近perlの本買って勉強し始めたんだけど 買った本に載ってた問題で「うるう年の判定スクリプトをif文の入れ子の形で書け」 ってのがあって print "year = ?"; chomp($year = <STDIN>); if ($year % 400 == 0){ print "uruu doshi desu\n" } else { if ($year % 4 == 0){ if ($year % 100 != 0){ print "uruu doshi desu\n" } else { print "hei nen desu\n"; } こう書いて実行したんだけどエラーが出て動いてくれません。 エラー内容を見てみると、最後の行がまずいらしいんですけど どう弄れば動いてくれるようになるのかさっぱり・・・
; 付け忘れだ
176 :
173 :2006/06/10(土) 02:07:33
動きました。 }の数が足りなかったのですね。 ご教授ありがとうございました。
my $flag = ( $year % 4 == 0 and $year % 100 != 0 or $year % 400 == 0 ); print qw( 平年 閏年 )[$flag] , "です"; って書いたあとにifを使う問題だと気付く・・・ my $mes = "平年です"; $mes = "閏年です" if $year % 4 == 0 and $year % 100 != 0 or $year % 400 == 0; print $mes; たぶん、問題からすると外れ・・・
ところで
>>173 見てて思ったんですけど、対応したカッコ({})に
正しくマッチする正規表現て作れるんですか?
179 :
デフォルトの名無しさん :2006/06/10(土) 04:43:49
perl初めたてであほな質問かもしれないのですが、、
$lineに
<a href="
http://***.com/abc/ " target="_blank">keyword</a> | <a href="
http://***.com/def/ " target="_blank">hoge</a>
が格納されているときに、前半のURLだけを取得したくて
$line =~ m/href=['"'](.*)['"'](.*)keyword(.*)/i;
print "match : $1 \n";
のような正規表現を書いてみたのですが、$1には
http://***.com/abc/ " target="_blank
がマッチングしてしまいます。
これはどこが間違ってるのでしょうか?
180 :
179 :2006/06/10(土) 04:46:24
" → ダブルクォーテーション ですorz
181 :
179 :2006/06/10(土) 04:48:36
あれ、なんか2chのhtmlタグ変換ルールがよくわからん(´A`)
>>178 Regexp::Common::balenced とか。
中で使ってる原理は
>>182 と同じだけどね。
$rand = int(rand(6)); if($rand == 0) { $a = "YES_00"; } elsif($rand == 1) { $a = "YES_01"; } elsif($rand == 2) { $a = "YES_02"; } elsif($rand == 3) { $a = "YES_03"; } else { $a = "NO"; } という処理をある条件下で判定させているのですが 1回目の判定が YES_00 だった際に2回目の判定は「YES_00」以外にしたいのですが どのようにしたらいいのでしょうか? まだまだはじめたばかりなのでアドバイスいただければと思います。
やりたいことがわからん。 判定がYESってなんだよ。判定は$randでやってるじゃねーか。 一回目の判定が $rand == 0 だったときという意味か? で、そのとき何をするって?
2回続けて同じ値にしたくないということだろうね。 例えば、0が出た後は、0以外の値が出るまで乱数を発生させたいとか。
数字が全角になってた。。orz 0 ⇒ 0
>>184 配列に0から6まで入れてシャッフルしてみれば?
189 :
184 :2006/06/10(土) 18:49:30
申し訳ないです。
>>186 さんの言うとおりです。
質問内容おかして混乱させてしまいまして申し訳ありません。
>>184 do{
$rand = int rand(6);
}while($a eq 'YES_00' and $rand==0);
if($rand <=3 ){
$a = 'YES_0' . $rand;
}else{
$a = 'NO';
}
191 :
179 :2006/06/10(土) 19:18:23
>>182 まさかここまで丁寧に答えてくれるとは、、ありがとうございました。
おかげさまでうまくいきました
にしてもPerlの正規表現は便利ですねぇ
192 :
デフォルトの名無しさん :2006/06/10(土) 19:18:55
open (DAT,"<sample.txt"); @file = <DAT>; close (DAT); %hash; for $i (@file){ @test = split(/[ ,\n,.,\",_,\=,;,:,(,),\',-]/,$i); for $i (@test){ $i =~ tr/A-Z/a-z/; $hash{"$i"} += 1; } } foreach $word (sort {$hash{$b} <=> $hash{$a}} keys %hash){ print "$word $hash{$word}\n"; } このプログラムでsample.txt内の単語の数をソートして表示するプログラムをつくっているのですが、結果に 367 the 214 in 63 is 60 of 56 and 38 god 33 to 32 that 31 … というように「 367」という謎の単語を表示してしまいます。 どうもsplitで記号を消去するときにでてきてしまうらしいのですが、、、どうすればこの謎の記号を%hashに登録しないようできるでしょうか?数が300以上の単語は表示しないなんてプログラムではだめだと思うのでなんとかしたいです。 よろしくお願いします。
my @a = (0..5); while(@a) { my $rand = splice @a, int(rand(scalar @a)), 1; print "$rand\n"; } こういう事じゃね?
>>193 は
>>184 の返信で
>>192 1つ勘違いしてると思うけど
@test = split(/[ ,\n,.,\",_,\=,;,:,(,),\',-]/,$i);
じゃなくて
@test = split(/[ \n.\"_\=;:()\'-]/,$i);
でおk
@file から一行取り出した時に最後に改行がついているので
"AAA BBB CCC\n"
この改行を chomp で取り除いてから split すれば多分大丈夫
もう…終わりだね…
>>192 空白とか(splitの対象文字)が367個入ってるということでは?
あと split で、なんでカンマを入れてるの?
カンマで区切るんじゃないけど…。
つか @test = split(/\W+/,$i); でよくね? んで全部ハッシュに入れ終わったら delete $hash{""}; とか。
♪なーつのおーわーどぅぃー
199 :
184 :2006/06/10(土) 19:39:06
みなさんレスありがとうございます。 まだまだ未熟ですが勉強していきたいと思います。 ありがとうございました。
200 :
192 :2006/06/10(土) 20:25:28
皆さんありがとうございました!! おかげで意味がわかんないあの367はきえました(T-T )( T-T)ウルウル あっざーっした!!
>>199 かわいそうに。
初心者の俺が作ったのを使ってみて。
$zenkai = "NO" if(!defined $zenkai); # $zenkai変数がなければ作る。とりあえず"NO"を代入
do {
$rand = int(rand(6));
if($rand < 4) {
$a = sprintf("YES_%02d",$rand)
} else {
$a = "NO";
}
} while($a eq $zenkai); # 前回と比較して同じなら繰り返す
$zenkai = $a; # 今のを前回のとして保存する
\.\/ もしくは区切り文字を変えて s|\./|$domain|;
>>204 おぉ、なるほど区切り文字って使い分けていいんですねぇ
ありがとうございましたっ
いらんお世話かもしらんけど、 s( )( ) s[ ][ ] s{ }{ } s{ }( ) とかも可能. あと、区切り文字と同じ文字を正規表現内で使う時は \ でっせ クウォートしても意味なっしんぐ
なるほど、いくつかパターンがあって都合のいいやつを選べばいいってことか ついでに、もう一つ質問なんですが $data =~ m/.*($key1|$key2|$key3)(.*?)/i みたいな感じで、いくつかのキーワードを含む物とマッチングしたい場合 keyが増えたときに、めんどくさいことになりますよね。 ここのkeyを配列@keyにいれて $data =~ m/.*(@key)(.*?)/i みたいな感じで、@keyの要素のどれかとマッチングを取るようにしたいんですが なにかスマートな書き方ってないでしょうか みたいにやりたいんですが、
208 :
203 :2006/06/11(日) 04:51:30
最後の行の 「みたいにやりたいんですが、」 は無視してください・・・
スマートかどうかは知らんけど、俺は正規表現を複雑にするよりforeachする。 foreach my $key (@array){ m/.*($key)(.*?)/i }
うーん、こうか? $data =~ m/((??{ join('|', @key) }))(,*?)/i;
>>209 のほうが好み。読みやすく、また通常は処理が速い。
用途にもよるけど気分的には \Q$key\E しておきたいところ。
212 :
203 :2006/06/11(日) 14:46:22
>>209-210 レスありがとうございます。
同じ処理が2カ所にあるんで、可読性があれになりますが
勉強ってことで両方使ってみようと思います(`・ω・´)
>>212 > 同じ処理が2カ所にあるんで、可読性があれになりますが
関 数 に 括 り 出 せ
展開は出来ても因数分解は出来ないってあれか?
俺Perl使い始めて10年近くなる事に気付いたけど、 こんな複雑な事やった事ない…。orz
216 :
デフォルトの名無しさん :2006/06/11(日) 18:22:17
「Perlオブジェクト、リファレンス、モジュール」 という本のクロージャという項目に書かれていた 内容について質問です ちょっと長くなりますがお許し下さい 引用---------------------------------------- use File::Find; my $total_size = 0; find(sub { $total_size += -s if -f }, "."}; print $total_size, "\n"; この無名サブルーチンが変数$total_sizeにアクセス している点に注目して下さい。変数$total_sizeが無名 サブルーチンのスコープの外部で宣言されているにも かかわらず、この無名サブルーチンは変数にアクセス しています。つまり、findから呼び出されたコールバック サブルーチンは、「「「本来なら直接アクセスできない変数 にアクセスでき」」」、さらにその変数の値を更新することが できるのです。 --------------------------------------------------- 「「「」」」で囲んだところが理解できません。 たとえば my $value = 10; function(); sub function { print $value; } このコードはちゃんと10と表示されます。サブルーチン内から サブルーチン外で宣言された変数には直接アクセスできます。 なのに本では「本来なら直接アクセスできない変数」と書かれ ています。どういうことなのでしょうか?
>>216 その比較した例は適切では無いね
{
my $value = 10;
function();
}
sub function {
print $value;
}
こう。$valueは上にあるブロック(=本の例ではファイルのスコープに相当)内でスコープが完結している。
対してfunctionサブルーチンはFile::Findモジュールにあるから、そのスコープからは$valueは見えない。
レキシカル変数については、そのスコープの範囲とか理解してる?
>>216 無名サブルーチンを定義した際、同じスコープにある変数は
無名サブルーチンからはグローバルに見える。
本来外側にあって見えないはずの my $total_size が
無名サブルーチンからも見える、ということ。
言葉で説明するのむずいな。
219 :
216 :2006/06/11(日) 18:49:19
>>217 を読んで
「理解できました。まじありがとうございます・・・」
と思っていたら
>>218 を読んでもう何もわからなくなりました
220 :
216 :2006/06/11(日) 18:50:08
222 :
216 :2006/06/11(日) 19:06:08
すみません、ちょっと確認させて下さい test01.pl-------- #!/usr/bin/env perl require 'test02.pl'; my $value = 10; test(sub { print $value; }); --------------- test02.pl-------- sub test { $sub = shift; &$sub; } --------------- 実行結果:10 test02.plを以下のようにしてもうまくいかない test02.pl--------- sub test { print $value; } こういう理解であっているでしょうか?
>>222 > 本来なら直接アクセスできない変数にアクセスでき
に対する理解としては多分良いと思う。が、
クロージャとコールバックに対する理解の話だとするならば、ずれてるな…
以下、高階関数に関する説明をしようかと思ったけれど上手く纏まらないので略。
ちょっと寄り道してschemeのlambdaと高階関数とか調べてみると確実な理解がしやすいかもね。
schemeのlambdaはクロージャそのものだから。
そもそも「クロージャ」(closure)って名前はレキシカル変数を「閉じ込める」事から来てるって偉い人が言ってた
>>216 すんません、俺もよくわかりません。
my $total_size = 0;
find(sub { $total_size += -s if -f }, "."};
print $total_size, "\n";
>変数$total_sizeが無名
>サブルーチンのスコープの外部で宣言されているにも
>かかわらず、この無名サブルーチンは変数にアクセス
>しています。
>本来なら直接アクセスできない変数
>にアクセスでき
外部で宣言されたmy変数にアクセスできるのは当たり前だと思うのです。
スコープの内側ならサクセスできないけど、なんで自分より外のmyにアクセスできると変なのかわからないです。
find関数の内部実行って意味の話なのかな?
これはリファレンスが送られるから、find関数で値は参照されますが…。
クロージャのスコープは定義した場所で決定して、実行場所とは関係ないから参照できて当たり前と思うのです。
ごめん、なんか問題の意味すらよくわからなくなった orz
my $closure; { my $hoge = "abc"; $closure = sub { print "$hoge\n"; }; $closure->(); # abc print "$hoge\n"; # abc } $closure->(); # abc print "$hoge\n"; # エラーになる $hoge はレキシカル変数なのでブロックの中でのみ有効。 しかし、クロージャの中にレキシカル変数を閉じ込めると、ブロックの外でも参照できる。 こんな感じでわかるかな?
>>225 >なんで自分より外のmyにアクセスできると変なのかわからないです。
多分、
>>216 で挙げられている本の例があまり良くないのだと思う。
外部のmyにアクセスできると変、というか不思議でしょ?とその本が言いたいのは
>>222 で挙げられている例の test() のように、
作成された無名サブルーチンを別のスコープに持って行っても
その無名サブルーチンを定義した時に見えていた my変数がそのまま見える
という所だと思う。
228 :
225 :2006/06/11(日) 22:09:14
あ、意味がわかりますた。
229 :
216 :2006/06/12(月) 00:46:10
みなさんいろいろと勉強になります
>>226 の内容は理解できました
>>225 意味わかったのかぁよかったね・・・
俺はまだ理解しきれません
あと少しで理解できそうです
すみません、最後に聞かせて下さい
a.pl--------------------
use File::Find;
my $total_size = 0;
find(sub { $total_size += -s if -f }, "."};
print $total_size, "\n";
-----------------------
これについてなんですが、
上記のfindに渡されるクロージャの無名サブルーチンは
>>225 が言うように、
a.plのスコープで実行されるんじゃなくて、
File/Find.pm内のfind関数のスコープで実行されるんですよね?
File/Find.pmのfind関数のスコープからは、a.plのスコープにある
$total_sizeは見えないはずなのに、クロージャを使うことで見える
ようになる、ということで間違っていないですか?
>>229 > a.plのスコープで実行されるんじゃなくて、
> File/Find.pm内のfind関数のスコープで実行される
うわぁ、違う。一番肝心なところが違う。
というか最後から7~4行目と2~1行目で言っていることが矛盾していないか。
その本の言いたいことはその後ろに、
「ように思うかもしれないが、クロージャは作られた場所の(静的)スコープが記録されており、
find関数がどうなっているかは関係なく、クロージャの作られたスコープで動作する。」
と続く。
ちなみに、呼び出し元が動的スコープだった場合(つまりこのときはクロージャではない)は
呼び出された関数から見えることもある。File::Findの例ではパッケージが違うので見えないけれど。
{
local $var = 10;
function(sub { print "anonymous: $var\n" });
}
sub function {
print "function: $var\n"; # localだと$varが見える
$var = 5; # 勿論書き換わる
shift->();
}
.plファイルにpatch.exe diff.exeのパッチをあてたいのですがやり方がわかりません 何かツール必要なのでしょうか? 色々調べたんですけどわかりませんでした
んー、このレベルで話す時ドコで実行されるの話は変になってくる。
その本も変だし。
>クロージャの作られたスコープで動作する
この表現も微妙。
あえてドコで実行されるかを言えば、クロージャのリファレンスのアクセス先。
>>229 は、クロージャの理解としては正解。
どこで実行されるとかよりも、クロージャがある限りmy変数が消えないで残ってるんだよ、ってところが重要なのであり、べつに「ドコで」とかはもうどうでもいい気が。答えようがないし。
---------------------
{
my $hoge;
}
#通常、この場所では$hogeは内部的にも消滅してる
#Perlは参照が不可能になった変数は破棄する。
---------------------
{
my $hoge;
our $closure = sub {$hoge = $hoge + 1}
}
#この場合、クローバル変数closureを通して$hogeが参照されるので、$hogeは消滅しないし、
#$closureをデリファレンスすると$hogeにアクセスされる。
#レキシカルスコープ(my)は静的なスコープで、コンパイル時に見たまんまのスコープが適用される。
#で、$hogeはこの時みたまんまのレキシカルスコープを持ってるんであって、ドコで実行とかは関係ない。
#だからxxのスコープで実行されるとかの表現も少し変。
#xxはyyのスコープにある、とかyyのスコープを持っているとか表現しる。
#ドコのスコープで実行されるとかは、動的なダイナミックスコープの話で、クロージャとダイナミックスコープは関係ない。
---------------------
233 :
230 :2006/06/12(月) 02:39:00
>>232 ごめん、確かに表現が悪かった。その上に意図を取り違えてたらしい。
否定した部分も、クロージャ内からfindのローカル変数にアクセスできてしまうかとか
そういう意味で捉えてしまっていたけれど、普通に動的スコープの話だと考えれば合ってたな。
と言うことで230撤回させてくださいorz 申し訳ない
234 :
216 :2006/06/12(月) 09:12:02
>>230 「間違いを正してくれてありがとうございます
やっと、なんとか一応理解できました」
と思ったら
>>233 で撤回されてしまいました
もうわけわかめ
>>232 すみません。もっかい確認させて下さい
1.pl-------------------
#!/usr/local/bin/env perl
require '2.pl';
my $value = 10;
function( sub { print $value; } );
----------------------
2.pl-------------------
sub function {
shift->();
}
1;
----------------------
$perl a.pl
10
上記において、1.plでmy宣言された$valueは
シンボルテーブルにも登録されずレキシカルスコープを持っているので、
その有効範囲は本来1.pl内にとどまるはず。
たとえ1.pl内でrequire '2.pl';としても2.plの内容は$valueのスコープ、
つまり1.plのファイルスコープには組み込まれない。
だから2.pl内のfunction内で$valueの値をprintしても何も表示されない、
ように思えるが、クロージャの作用でちゃんと$valueは10と表示される。
この理解で大丈夫ですか?
至極当然の動作な気が
perlのsortって内部ではどういうソートやっているんですか? バブルソート?クイックソート?
perldoc sort に書いてあるです。 基本はマージソート。設定によりクィックソートも可。
質問です Fcntl.pmの:flockの LOCK_SH LOCK_EX LOCK_NB LOCK_UN の値は全てのプラットフォームで共通でしょうか
>>237 らくだ本のsortの項目には書いてないことが
5.8.7のperldoc sortにはたくさん書いてあるね
昔はデフォルトでクイックソートだったが、
5.8からはマージソートになったんだね
勉強んなったありがとー
>>238 違う値になってるのは見たことはないが、同じである保証はないと
思って書いとけ。
241 :
デフォルトの名無しさん :2006/06/12(月) 16:21:57
ぎゃー 表示があかしくなってしましました。 以前は、「total 単位:万」とtを下に横書きで表示されていたのですが、 下記のようになりました。 万 : 位 単 l a t o t GDのバージョンを2にしたのが原因かと思われますが、 さくっと解決する方法ありますでしょうか? フォントとか変えるだけでうまくいかないものでしょうか?
>>241 知らないけど、文字の描画方向が下から上の縦書きになってんじゃないの?
そんな自然言語見たことないが。(世界は広いからどこかにあるかも知れないな)
mod_perl時の場合END{}はプロセスが終了した時のみに実行されますが mod_perl時にPerl/CGIのEND{}と同様の事をしたい場合どうするのが一番良いのでしょうか。
P***Gua****というものを導入しろと言われたのですが*に入る文字って何か分かりますか?
$a=6; for($i=0;$i<100;$i++){ $a=$a-0.1; print("$a\n"); } のようにすれば6から0.1ずつ引いていってくれるはずだと思ったのですが、 ある数値を境に、0.99999998などというような数値になってしまいます。 何か間違えている部分はありますでしょうか。
>>245 PeerGuardian?
一文字多いか
まぁ use bignum; でもしてろってこた
なるほど。 因縁みたいなもんなんですね。
>>246 ありがとございます。そちらで聞いてみます。
ねぇ、POEってすごくね?
ゴノレゴの人?
>>254 うん、すごいね。どんどん活用しようぜ!!
もうPerlから足を洗いたい、 という願いを込めて、持ってた本を全部処分した。すっきり。
>>257 いままでお疲れさまでした。
これからもHaskell世界でご活躍ください。
>>257 どうしてperlから足を洗いたいと思ったの?
ま、まさかあんたはてなの中の人じゃないだろうね
熊田曜子写真集はどうなりました?
プログラム自体やめるのは聞いたことあるけど、言語から足洗うなんて初めて聞いた。
> 言語から足洗うなんて初めて聞いた。 俺は PHP から足を洗った。 おかげでストレスがが溜まりません。
うまく説明できませんが、以下の文字列を取得して実行する場合、 普通はどうゆう風に実行するのが一般的っていうか、普通なのでしょうか。 ((100 + 200) / 100) + (50 / 10) evalとかそうゆう話じゃなくて、(カッコ)のネストの解析の話です。 いろいろ考えましたが、 1:開きカッコを見つけ次第、開きカッコの数を数えながら閉じカッコを見つけて、対応するカッコを探していく。 2:正規表現で外側のカッコの中から、式を抜き取ると同時に、適当な重複しない名前を置いておく(置換する)。 3:その際、優先順位は左の開きカッコから順番とする。 4:抜き取ったカッコの中身は抜き取った順が狂わないようにハッシュに入れていく。 5:最後に抜き取った順から、実際の式を計算する。 6:計算が終了するたびに、置いてきた名前と式の結果を置き換えていく。 7:全部終わったら完了。 って手順は変ですか?
>>264 evalじゃだめですか(´д`;)?
括弧による優先順位がある場合、
普通は再帰を使った解析をします。
ということでevalじゃだめですか(´д`;)?
MVCフレームワークの無意味な乱立具合からも PHPはクソのクソまみれだと確信できる というかフレームワークいくつもいらないだろ? その点Perlはホリエさんの遺品があるからばっちぐー
逆ポーランド記法最強
>>264 そういえば式の解析は Perl 4 のラクダ本に載ってたなあ。
でもそれはたしか再帰使ったりして散々解説したあとで最後に
全部捨てて
print eval $_,"\n";
の1行にして終わっていた。w
(これはLarry Wall がウケ狙いで書いてたんじゃないかと思う)。
まあ、そういう計算式の解析については再帰使うのが定番なので
普通に再帰でやればいいんじゃないだろうか。Perl なら文字列の
扱いが楽に書けるのでC言語とかとはまた違った分かり易い形で
書けるかも知れない。
evalをホイホイ使うとwhile (1)入れる馬鹿が必ず湧くからなぁ。
汚染チェックどうぞ。馬鹿はお前。
普通じゃないと思うけれど、こういうのもありかな sub calcflat { eval shift } # 括弧の無い式の計算 my $exp = '((100 + 200) / 100) + (50 / 10)'; 1 while $exp =~ s{\(([^()]*)\)}{ calcflat $1 }ge; print calcflat($exp);
272 :
デフォルトの名無しさん :2006/06/15(木) 15:25:09
open関数についての質問です。 入出力記号について調べていたらこんな表を目にしました。 ┏━━┯━━┯━━┯━━┯━━┯━━┓ ┃ │読取│書込│追加│作成│上書┃ ┠──┼──┼──┼──┼──┼──┨ ┃ < . │ ○ │ × │ × │ × │ × ┃ ┠──┼──┼──┼──┼──┼──┨ ┃ > . │ × │ ○ │ × │ ○ │ ○ ┃ ┠──┼──┼──┼──┼──┼──┨ ┃ >> │ × │ ○ │ ○ │ ○ │ × ┃ ┠──┼──┼──┼──┼──┼──┨ ┃ +< │ ○ │ ○ │ × │ × │ × ┃ ┠──┼──┼──┼──┼──┼──┨ ┃ +> │ ○ │ ○ │ × │ ○ │ ○ ┃ ┠──┼──┼──┼──┼──┼──┨ ┃.+>> │ ○ │ ○ │ ○ │ ○ │ × ┃ ┗━━┷━━┷━━┷━━┷━━┷━━┛ これを見る限りでは、テキストファイルの読み込みと書き込みを行う時は いつも+>を使えば済むと思いました。 <と>を使い分ける必要はあるのでしょうか?
>>272 その「上書」と言うのは、ファイルを作り直す。
つまり、元のファイルの中身が消える、と言う意味。
だから+>は読み取りには使えない。
全て +> にすると書いちゃいけないファイルに書くとか、書く だけで読んでも意味のないファイルから読むというような間違った コードを書いてしまった場合にエラーが出ないのでそのバグの 発見が遅れる。
275 :
264 :2006/06/15(木) 16:08:20
「evalの話じゃない」って書いたのに。。。。。 まぁ、短い記述しか読まないと思うのでうまいこと綺麗に見えるように工夫しながら書いてみます。 ありですた。
>>271 のでいいんじゃないの?
eval部分は括弧ないんだから、自前のルーチンでも何でもいいじゃない。
277 :
272 :2006/06/15(木) 16:27:53
>>273 >>274 どうもです。目的にあわせて使い分けることにします。
もっとよく実験してみます。
別に読み込む記述はperlじゃないし、 例えperlだったとしても外部から指定された記述をevalするわけありません。 それを一言にまとめると「evalの話じゃない」ってなります。 一応動作する記述は書けたんであとは綺麗になるように書き直します。
あ、すんません、意味を取り違えました。 ちゃんと271さんのも試してみてます。 なんかやってるうちに綺麗にかけそうな気がしてきたんで、とにかくありですた。
自分の伝達能力の低さを他人のせいにするとは。性格悪いね。
「構文解析をしたい」って言えば一言で終わったのに。 まぁそういう風に質問できる奴なら、自分で CPAN のライブラリでも見付けるか。
宿題で↓が出されました。まったくできません(ノ∀;) 親切な方教えてください。 【辞書ファイル(dic.txt)】 that あれ is です my 私の book 本 you あなた have 持っている 【文書ファイル(text.txt)】 That is MY book . You have a book . ex9.pl:辞書ファイルと文書ファイルを読み込んで翻訳するプログラム exA.pl:日本語の順番(動詞を最後)に表示するプログラム(辞書ファイル作り直し可) ex8.pl:文書ファイルにI have this book .を追加。
>>282 できませんじゃなくて、まったく考えてもいないのでは。
>>282 ex9
辞書を読み込んでハッシュに。
そのハッシュを使って文書ファイルを置換でOK。
(辞書にない単語は空文字列で置き換え…か?)
exA
辞書に品詞情報を追加
ex9と同様に置換したあと、品詞情報で動詞なのを最後に持ってくるでOK。
ex8
意味わかんね
これでできなきゃその授業はあきらめたほうがいいかな。
つーか、この授業なに?
宿題だした先生がここ見たらどう思うだろうね。
こういうところで他人をあごで使ってたやすく答えを得る 力が本当に試されている部分だと思うよ
288 :
デフォルトの名無しさん :2006/06/16(金) 10:41:54
>>287 そう、自分でコードを書くなんてバカのやること。
最近は、どうやって人を騙してタダで仕事をさせるかが問われている。
Web2.0っていうやつだな。
質問文に『〜ここの人には難しいかもしれませんが〜』とか入れとくと簡単に答えてくれる
ex9.pl
>>282 俺もperl勉強中なんで考えてみた
ex9.pl---
#!/usr/bin/perl
use warnings;
use strict;
open my $fh, '<', 'dic.txt' or die "$!";
my %word_list = map { tr/\n/ /;split / /; } do { local $/;<$fh> };
#print %word_list;
open $fh, '<', 'text.txt' or die "$!";
my @target_list = map { tr/\n/ /;s/\./ ./g;split / /; } do { local $/;<$fh> };
foreach (@target_list) { print "$_\n";if(defined($word_list{$_})) { $_ = $word_list{$_}; } }
print "@target_list";
dic.txt---
am です
I 私は
fack ファック
you あなた
are です
pussy プッシー
text.txt---
I am fack.
you are pussy.
結果:
私は です ファック .
あなたは です プッシー .
あ、最後の所に s/\./ ./g for @target_list; s/^ //g for @target_list; 追加です
あ、ちがった s/^ //m for @target_list; だった
あ、もうだめぽ
use warnings; use strict; open my $fh, '<', 'dic.txt' or die "$!"; my %word_list = map { tr/\n/ /;split / / } do { local $/;<$fh> }; open $fh, '<', 'text.txt' or die "$!"; my @target_list = map { tr/\n/ /;s/\./ ./g;split / / } do { local $/;<$fh> }; foreach (@target_list) { if(defined($word_list{$_})) { $_ = $word_list{$_}; } } s/\./.\n/g for @target_list; my $result = join '', @target_list; print "$result\n"; やっとできたぽ
この調子で他の2問も解いてやるぽ
ex8.pl--- #!/usr/local/bin/perl use warnings; use strict; open my $fh, '>>', 'text.txt' or die "$!"; print $fh 'I have this book.'; やったぽ問い3も解けたぽ
exA.pl--- use warnings;use strict; my @verb_list;my %word_list;my @result; open my $fh, '<', 'dic.txt' or die "$!"; my @word_list = <$fh>; foreach (@word_list) { my @a = split; foreach (@a) { if (s/\[v\]([^ ].*)/$1/) { push @verb_list, $1; } } $word_list{$a[0]} = $a[1]; } open $fh, '<', 'text.txt' or die "$!"; my @target_list = <$fh>; foreach my $verb (@target_list) { $verb =~ s/\.$/ ./; foreach my $verb2 (@verb_list) { if ($verb =~ /$verb2/) { $verb =~ s/(.*)($verb2)(.*)(\.)/$1$3$2 $4/g; } } my @a = split / /, $verb; foreach (@a) { if (defined($word_list{$_})) { push @result, $word_list{$_}; } else {push @result, $_;} } } foreach (@result) { print ;} やったぽできたぽ
dic.txt--- [v]am です I 私は you あなたは [v]are です fack ファック pussy プッシー text.txt--- I am fack. you are pussy. 結果: 私はファックです. あなたはプッシーです.
299 :
デフォルトの名無しさん :2006/06/16(金) 13:52:06
私はプッシーです
300 :
デフォルトの名無しさん :2006/06/16(金) 14:08:17
ageてる奴の書込みは見る必要がない事に気がついた この書込みも同類だろうからあげとこうか
お前なんとなくuse warnings; use strict;付けとるだけちゃうんかと
302 :
デフォルトの名無しさん :2006/06/16(金) 15:48:02
あなたもわたしもプッシー プッシー
このソースを教授に提出したなら、 もう来年から教授は授業にperl使わないだろうな
ex9.pl & exA.pl 短かめを狙ってみた。 #!/usr/bin/env perl -w use strict ; my %ha = split /¥s+/, do { local( @ARGV, $/ ) = 'dic.txt'; <> } ; map { chomp; chop if /¥.$/; s/¥ba¥b/ /; my @ou = map{ $ha{ lc $_} ? $ha{ lc $_ } : do { die } } split /¥s+/, $_ ; # exA.pl としてだったら下の行の # を外す。 # push @ou, splice @ou, 1, 1 ; print join ' ', @ou ; print "¥n" ; } do { local @ARGV = 'text.txt'; <> } ; これ、このままコピペして宿題として提出したら先生の反応は面白いかも。
俺ならこうするな open DIC, '<dic.txt' or die "$!"; open TEXT, '<text.txt' or die "$!"; my $DIC = <DIC>; my $TEXT = <TEXT>; close DIC; close TEXT; my %DICK = /\s/, $DIC; while ( my ($key, $value ) = each %DICK ) { eval"$TEXT =~ s/$key/$value/mg"; } print "Ilovemankonoana\n";
my %DICK = split /\s/, $DIC; だな
少し以前から、自分はプッシーなのでは無いかと薄々感づいていました。
ワシもワシも
309 :
282 :2006/06/16(金) 21:20:43
ありがとうございますm(_ _)m このまま提出します!
ちょw
282の先生 「う〜む、ずいぶんスパゲチィなコードだなぁ。」 282 「教授、そこがperlの魅力なんですよ!頭の中にあるもやもやした 形にならない思考をコードを書きながら具現化できる、こんなことができるのは perlぐらいですよ!」 教授 「まぁよくわからんがとりあえず実行してみて確認してみるか」 #perl ex9.pl あなたはプッシーです.
直後教授が発行したSQL UPDATE SEISEKIHYO SET HYOKA = '0', SET RIYU = '私は断じてPUSSYなどではない' ヒント:WHERE条件を設定し忘れている
実力にそわないもの先生に提出したらバレるんちゃうか普通
GUI::Loft使ってみたんだけど、Richeditのフォントサイズとフォントってどうやって変えるのか知ってる?
315 :
デフォルトの名無しさん :2006/06/17(土) 22:52:02
ほしゅ
316 :
314 :2006/06/17(土) 23:54:03
結局、Loftで作成したものを変更というのは諦めて、 ->AddRichEditして、そこでフォント変更するようにした。
317 :
デフォルトの名無しさん :2006/06/18(日) 17:06:41
スクリプト内で「use encoding」を記述したところ、 下位ディレクトリにある、日本語を含むテキストファイルをOPENできませんでした。 スクリプトと同じディレクトリにあるファイルはOPENすることができます。 かれこれ2、3時間ハマってます…。 対処法をご存知の方がいらっしゃいましたらご享受願えませんか?
せめてopenに失敗したあとの$!ぐらい晒せよ
319 :
デフォルトの名無しさん :2006/06/18(日) 18:42:58
>>318 失礼しました。
メッセージ内容は以下の通りです。
「No such file or directory at EditEnquete.pl line 35.」
ちなみにエラー箇所のソースは以下の通りです。
「open (IN, "<:encoding(jis)", "./email/$file") or die $!」
日本語を含まないファイル名(例:aaa.txt)では問題なくOPENできます。
メールファイル(拡張子.eml)をそのまま入力にしていますので、
エンコード指定はJISとしております。
色々試してはいるんですが中々うまくいきません…。
>>319 日本語のファイル名でだめなときは、たぶんファイル名の文字コードがお前のシステムが
期待するものと合っていない。
ファイル名をopenに渡す前に適切な文字コードにencodeすればいいと思われる。
321 :
デフォルトの名無しさん :2006/06/18(日) 19:46:50
>>320 文字コードcp932を使用していることがネックになっているらしいと判明しました。
※対処法までは調べ切れませんでしたが…
もう少し頑張ってみるつもりですが、
最悪 前処理としてrenameすることも検討してます。
回答ありがとうございました。
>>322 そこにある例なんだけど、encodeしたあとで再度decodeする必要ってあるんだろうか?
Windows xpでActivePerl使って試してみたんだけど、
use encoding 'cp932';
use Encode qw(encode decode);
my $f = "一覧表.txt";
my $g = encode('cp932', $f);
open my $fh, '<:encoding(cp932)', $g or die @!;
while (<$fh>) {
print $_;
}
close $fh;
decodeしないでもファイルオープンできて、中身もちゃんと読めた。
ディレクトリだってば
win2000なんだけど DBI普通に業務に使っていいよね? 日本語処理に関して致命的な欠陥とかないよね? 文字コードはcp932なら問題ないよね?
>>325 データベースを使うのにDBIを使わない選択はないと思うが。
というかDBDによるんじゃね?
>>321 その用途なら use encoding ではなく use open の使い所だと思うよ。
ファイル名は別途、適宜 Encode::(de|en)code して使いましょう。
>>325 > DBI普通に業務に使っていいよね?
だめです。なぜならあなたはそれをここで訊いているからです。
それを相談できる相手が社内にいないのであれば、いずれ部署内では保守できなくなり、リプレースが行われることになります。
その時にはもう二度と Perl が選択されることはないでしょう。
> 文字コードはcp932なら問題ないよね?
安心してください。cp932 *でも* 問題なく処理できる方法があります。
329 :
デフォルトの名無しさん :2006/06/20(火) 04:20:17
みようみまねでソース書いてる超初心者です。質問させてください。 特定のフォルダ内のテキストファイルのファイル名を配列filesに 取り込んで、ファイル名およびその内容を表示させたいと思っています。 以下のソースを書いてみたのですが、テキストファイルの中身を 表示させる部分がうまくいきません。「←A」の部分がおかしいのでは、と 思っているのですが・・・ 正しい記述を教えてください。よろしくお願いします。 $mes = chdir "c:/program files/test"; @files = glob("*.txt"); foreach (@files) { print; print "\n"; } $i=0; do{ open ( FH , " < $files[$i].txt" ) ; #←A @data = <FH> ; print @data; $i++; }while($files[$i]!=""); close ( FH ) ;
>>329 突っ込みどころが恐ろしいくらいに沢山あるけど、とりあえず直接的な原因はPerl以前の話だ。
> $files[$i].txt
.txtは余計だろうがゴルァ
しかし、foreachを知ってるらしいのに、何でわざわざdo-while文で$iを
インクリメントして頑張っているのやら…。もしかして、変数に入れる方法を知らない?
foreach my $scalar (@array) { $scalarをここで使う }
で、$scalarにそれぞれの要素が入る。これを省略すると$_に入る。
myは今の段階では、その{ }の中でだけ$scalarを使うと言う宣言だと思っておけば良いと思う。
以下、漏れが書くとこうなる。ご参考までに。
chdir "c:/program files/test";
my @files = glob "*.txt";
foreach my $file (@files) { print $file, "\n" }
foreach my $file (@files) {
open my $fh, '<', $file
or die "Can't open $file: $!\n"; # 開き損ねたらエラーメッセージを吐いて死ぬ
print <$fh>; # そのまま出力するだけなら変数に入れるまでもあるまい
# open my $fh, (ryで開いておくとスコープアウトすれば閉じられる
}
331 :
329 :2006/06/20(火) 06:03:49
>>330 ありがとうございます。
でも、実行するとエラーが出てしまいます・・・
Unrecognized character \x81 at C:\(中略)\copal277\copal.tmp line 6.
最終的には、ファイル名やファイルの中身の表示は不要で、
ファイルの中身を用いた計算結果のみ表示させようと思っています。
どう見てもインデントの全角スペースをタブに戻してません。本当に(略
333 :
329 :2006/06/20(火) 06:26:55
>>330 >>332 成功しました〜。
当方、Excelマクロをほんのちょっとかじったことがあるくらいで、perlは昨日勉強始めたばかりですw
どうみても無謀です。もうね、俺、本当にアボガド。
教えていただいたソースの内容、ネットで検索しながら勉強させていただきます。
ありがとうございましたm(_ _)m
>>333 Perlは比較的簡単だから、むぼーでもないが、
全角スペースぐらい視覚的にわかるエディタでも使いなさい。
Net::SMTPを使用しているのですが、 $smtp = Net::SMTP->new("yahoo.co.jp"); などとしても自動的にMXレコードから引っ張ってきてくれません。 モジュール等は使わずに MXレコードのIPアドレスを取得する方法等、ありませんでしょうか。
あんま関係ないけど、始めたばっかの時は汚い記述書かないように注意してね。 Perlの敷居が低いと言われるのは汚い記述が可能だからなんだけど、 普通汚い記述書かないし、綺麗な記述かこうとすると、初心者には他の言語より敷居が高いですぜ。
>>335 コンストラクタの第一引数ってhostだよね。
ドメイン渡したらMXレコード自動的に引いてくれるなんてどこに書いてある?
今度はどんなスパムが増えるのかな?w
340 :
335 :2006/06/20(火) 15:09:27
Net::DNSを使用すると簡単に出来る事は知っています
あくまで標準モジュールor組み込み関数のみで可能なのかお聞きしたかったのです。
>>337 Net::SMTPと云う名前のモジュールを名乗っているのですから、
それぐらい標準で出来て欲しいなと思いました。
突っ込まなきゃ入ってないモジュールを使うのに 突っ込まなきゃ入ってないモジュールを使いたくないとは これいかに。
アホは放置しろよ。
出来合いのモジュールなんか使わなくてもたいていのことは自分で一から書けばできますよ。 ガンバレ。 時間の無駄だけどな。
>>341 Net::SMTPは標準モジュールですが、何か?
345 :
335 :2006/06/20(火) 15:31:03
Socket使ってフルスクラッチで書くしかありませんか。 後出来たら無駄な煽りはやめて欲しいですね。 分からないタコは黙ってて下さい(笑)
>>344 あああ、まぢ。
気がつかない間に入ってやがる。。。。
これを入れるならNet::Telnetも入れとけってんだ。
>>343 ああいう馬鹿なこと聞くやつらにはむしろ自分で書かせたほうがいいと思う。
349 :
335 :2006/06/20(火) 15:56:20
おめーら全員かかってこい
つまんね
はいはい、コンパクトコンパクト。
はいはい、テクマクマヤコン テクマクマヤコン。
1〜n個のサブディレクトリにいくつかのビットマップファイルが入っているのですが、 それらのファイルのすべての組み合わせを作りたいですが、どう作ればよいのか教えていただけないでしょうか? 例えば dir1: file1_1.bmp, file1_2.bmp dir2: file2_1.bmp, file2_2.bmp, file2_3.bmp なら file1_1.bmp + file2_1.bmp file1_1.bmp + file2_2.bmp file1_1.bmp + file2_3.bmp file1_2.bmp + file2_1.bmp file1_2.bmp + file2_2.bmp file1_2.bmp + file2_3.bmp という結果が欲しいのです。 宜しくお願いします。
まあ、個々のディレクトリからファイル名を取ってくるところは省くとして my %uniq = () ; my @data = ( ### ファイル名一覧 ) ; for my $id ( @data ){ for my $id2 ( @data ){ next if $id eq $id2 ; $uniq{$id . '.' $id2} ++ if ! defined $uniq{$id . '.' . $id2} and ! defined $uniq{$id2 . '.' . $id} ; } } print $_ . "¥n" for keys %uniq ; って漢字?
356 :
353 :2006/06/20(火) 17:28:51
>>354 ありがとうございます。しかしすいません、
>>353 の例の様に、
同じディレクトリのファイル同士の組み合わせは作りたくないのです。
説明が足らなくてすいません。
…何でもあるなあ > CPAN
ファイル名がディレクトリに木賃と依存するなら ( 353 の例のように file1_ file2_ ってなってるなら) next if ( $id =~ /file(¥d+)/)[0] == ( $id2 =~ /file(¥d+)/)[0] ; を 354 の next ~ の次の行に入れればいい。 ファイル名が違うなら…説明がめんどいので略。 # Set::CrossProduct かあ。メモメモ。
自分で作ると意外と手間だもんなぁ。 use strict; my @files = ( [qw(d10, d11, d12, d13)], # dir1 [qw(d20, d21)], #dir2 ); my $nCombi = 1; for (@files) { $nCombi *= @$_ } my @combi = (0) x @files; my @result; for (0..$nCombi-1) { my $i = 0; push @result, [map $files[$i++][$_], @combi]; #print "@{$result[-1]}\n"; for (1..@files) { ++$combi[-$_] == @{@files[-$_]} ? $combi[-$_] = 0 : last; } }
>>355 ありがとうございます。こんなモジュールがあったなんて知りませんでした。
早速使ってみます。
非再帰で書き起こせる人って尊敬するわ sub cross_product(&@) { my ($proc, @lol) = @_; my $rec; ($rec = sub { my $i = shift; if (@lol == $i) { $proc->(@_); return } $rec->($i + 1, @_, $_) foreach @{$lol[$i]}; })->(0); } cross_product { print "@_\n" } @files; # 暇なときにはCPAN散策してるってのにまだまだ知らない便利なモジュールいっぱい
単にちょっとした好奇心から質問なんだけど、 あるディレクトリからそれ以下の最新ディレクトリまでの全てのディレクトリを検出するの。 でも再帰は使わないの。 どうすんの?これ? 見たいので見せてください。 俺はできませんでした。
配列に入れたり出したり
364 :
353 :2006/06/20(火) 20:04:00
できました!CrossProduct超便利ですね
ありがとうございました。
>>362 dir (or ls) をパイプ付きで open するとズルができます。
open(DIR, "dir /s /q |");
/q じゃないや /b
>>363 やってみたら出来た。再起よりコンパクトになった。と言うかループの中3行になった…。
なんだよこの簡単さは…。この前考えた時はすごく苦労して出来なかったのに。
>>364 パイプは使わんのでよくわからんから検索してくる。
コード見せてくれませんか?参考にしたいので
なんだ。コンパクトはできないのかw
ぼくはばかだから
my @work = ("f:"); while(@work){ print $_ = shift @work, "\n"; push @work, grep -d && !/^\.\.?$/, glob "$_/*"; } ワンライナーまでもうちょっと?
凄い…
printする位置を見つけたゾ!
perl -e "push @ARGV, grep -d&&!/^\.\.?$/&&print($_.$/), glob shift(@ARGV).'/*' while @ARGV" C: D:
>>373 ありがとう。 と言ったそばから(&亀レス)で悪いけど
>>47 のsオプションいらんからね。
わんらいなー化オメ printは、 perl -e "print $_,$/ and push @ARGV,grep -d && /[^\.]/,glob qq($_/*) for @ARGV" f: perl -e "print $_,$/ and splice @ARGV,++$a,0,sort grep -d && /[^\.]/,glob qq($_/*) for @ARGV" f: みたいな真似もある気がする。
open(PIPE, "find @ARGV |") or die(); print while <PIPE>; close PIPE;
www
378 :
デフォルトの名無しさん :2006/06/21(水) 17:00:34
アップロード掲示板にリサイズ機能を持たせたのですがリサイズがうまくいきません。 widthが1600程度ならなんとかなるのですが、2000を超えるものになるとなぜか リサイズ後の画像が真っ暗になっています・・ コードが悪いのでしょうか・・? 当方レンタルサーバにて、ImageMagick対応とのことでしたのでネットで調べながら ImageMagickにてリサイズを行いました 以下リサイズロジックです。 use Image::Magick; $file = "./test.jpg"; $img_w_max = 860; my $new_image = Image::Magick->new; $new_image->Read("$file"); my $width = $new_image -> Get('width'); my $height = $new_image -> Get('height'); if ($width > $img_w_max) { my $ratio = $img_w_max / $width; my $width_new = $width * $ratio; my $height_new = $height * $ratio; $new_image->Scale(width=>"$width_new", height=>"$height_new"); $new_image ->Write("$file"); } print "Content-type: image/jpeg\n\n"; binmode STDOUT; $new_image->Write('jpeg:-'); undef $new_image; exit; アドバイスお願いしますorz
関係ないけど "$file" とか "$width_new" とかってダブルクォートで括るのは 単なる無駄だよ。無駄な文字列生成してる。
>>378 縦横比変えないなら、ScaleじゃなくてTransform使ったら?
比率の計算も要らないし。
何故黒くなるのかは分からないが
暇だったら、お勧めのデバッグ用モジュール教えれ。 俺っちは今んとこ Smart::Comments 汎用性のあるお勧め CPAN モジュールでも可。
デバッグ用じゃないけど、地味な所で Config::Simple
そっち系だと AppConfig ま、惰性で使ってんだけどさ
汎用性ってのは言語拡張的なものでも良いのん? まだ使い込んでないけれど注目してるやつで、Contextual::Return
385 :
381 :2006/06/22(木) 00:41:12
なんでも wellcome っす。 Contextual::Return 便利そうだな。メモめも
Inline::C #Inline::rubyってうちの環境だと動かん。まあ、興味だけだからどうでもいいんだが…
>>387 thx.
頭の片隅に入れとこ
つーかほかの紹介モジュールの方が興味深かったりw
あんまり面白いの紹介されてなかったorz... 寝よ...
Menchmark
MFPMでぐぐった方が良いのでは
能動的に探すんだったら MFPM でもいいかも知らんが、情報少な杉。 だったら google した方がよいとおも。
winでperlでmysql5なんだが mysqlバージョン4.1以降は日本語処理がややこしくなって DBI->connect時にmysql側の設定ファイルを読み込むよう 指定しなくちゃいけないみたいで 以下のようにやってみたんだけど Incorrect database name '/program files/mysql/mysql server 5.0/my.ini' とエラーになってしまう use DBI; eval { my $dbh = DBI->connect('dbi:mysql:test,hostname=localhost;mysql_read_default_file=C:/Program Files/MySQL/MySQL Server 5.0/my.ini; } 多分ファイルパスに含まれる「:」やスペースがまずいとおもうんだkど どうすればいいですか?
perldocするときエンターキーで一行ずつしか読み方知らないんだけど 一画面ずつとかする方法はないの?
スペースは駄目なん? PageUpとかPageDownとか
perldocは適当なページャを呼んでるだけだから何が呼ばれてるかわからないと なんともアドバイスのしようがないと思われる。
スペースでうまくいった・・・ あれ?なんでだろ?一番最初に試したはずなのに どうもありがとうございました
単体テストのモジュールで、お勧めを教えてください。
>>393 クォートで括ってみれば?
それでも駄目ならprogra~1を使うとかスペースを含まないディレクトリにハードリンクを作るとか。
……あれ、testの後ろコンマに見えるけど、いいんだっけ?
database=test;とかにしてみたらどうですかね。
関係ないかもしれないけど気になった。
#ちゃんとドキュメント読めって話ではある。
#たぶん書いてるでしょ。
400 :
393 :2006/06/23(金) 03:21:53
おまえ天才!!! dbi:mysql:test,hostname=localhost;mysql_read_default_file=C:/Program Files/MySQL/MySQL Server 5.0/my.ini この記述からmysql_read_以降を取り去って試してみたら 問題なくテーブルの操作等行えた DBD::mysqlのperldoc読んでもdbi:mysql:test,hostname... みたいなカンマを使った記述はなかった どこでこんなの覚えたのやら・・・ で、最初のやつをカンマをセミコロンに直すと別にクォートしなくても通った! さんくす!!! しょうもないバッドノウハウ見つけちまったい
401 :
デフォルトの名無しさん :2006/06/23(金) 09:18:03
$a = "9z"; print $++a, "\n"; 9 -> 0, z -> a とのことなのでこの結果は 10a になると思ったのですが 10 になります。 なぜでしょう?
うちのcygwinだと、0だった。
>>401 perlopには以下のように書いてある。
The auto-increment operator has a little extra builtin magic to it. If
you increment a variable that is numeric, or that has ever been used in
a numeric context, you get a normal increment. If, however, the vari-
able has been used in only string contexts since it was set, and has a
value that is not the empty string and matches the pattern
"/^[a-zA-Z]*[0-9]*\z/", the increment is done as a string, preserving
each character within its range, with carry:
'9z'は/^[a-zA-Z]*[0-9]*\z/にはマッチしないので普通に数値として解釈される
はずで、数ではじまって後ろに余計なものがついた文字列は余計なものを取り
除いて扱われる(この場合は9)のだから10であってると思われる。
cygwinで0になるのはわかんね。
v5.8.7 built for cygwin-thread-multi-64int で10になったが $++a のまま実行したんじゃないのか
>>404 > cygwinで0になるのはわかんね。
$++a == $+ + a
ほんとだ。無意識に++$aに補正してたよ...
408 :
401 :2006/06/23(金) 11:24:53
>>401 質問自体を間違えてました。(汗
$++a は ++$a の間違いです。
>>403 >>404 で理解できました。ありがとうございました。
まだPerl初めて2週間なんだけど、 今月末までにHTML::Parserと、LWP::UserAgentをマスターしろと言われた… さっぱりわからない 後1週間しか無い訳なんだけど、みんなこの短期間で出来る?初めて2週間で。 この仕事がクリア出来なかったら首が飛ぶことになってるwwwww orz
他の言語をマスターしてる & マークアップ言語を理解しているなら楽勝。 何もかも初めてなら、身の振り方を考えておけ。
>>410 いや、プログラミング自体初めてで、
出来るのなんてReshackerで日本語化くらい…
身の振り方は…まだヤングなんでちょっとわからんですたい
>>409 HTML::Parser と LWP::UserAgent ならとりあえず使えるようになるまでが
数時間で詳細まで調べてかなり使えるようになるのが一週間ぐらいじゃないか?
(人によるか。そんな掛かんないかも)
Perl 初めて2週間か。とりあえず朝も晩も電車乗ってる時もそればかり勉強
してれば何とかなるのでは? もちろん家と会社ではPCを使って延々と実習。
寝るとき以外は休まず7日間な。どうしても分からなくなったらここで聞け。
そのぐらいやればいくら何でも脳に刻み込まれるだろう。(逆に言うと、そこ
までやってもサッパリ分からないとか、そんなことまでしたくない、という
場合はもう一生辞めておけ)。
こんなところで下らん質問している時点で、お先真っ暗。
>>412 一週間ですか…もうどこから初めて良いのかわからなくて…
>>413 の言う通りお先真っ暗ですよw
会社で勉強だけをするのは無理な状況なんで、深夜に勉強してる。
とりあえず、一週間死ぬ気で勉強してみるよ!!
ありがとうござます
死ぬ気で頑張れば出来る事がわかっただけで、励みになりました。
超ありがとう
415 :
デフォルトの名無しさん :2006/06/23(金) 15:11:29
質問します 下記のようなファイルをまとめて削除したいのですが、 /var/www/cgi-bin/alog/logs/*300.cgi perlの unlinkを使用して下記のようにいったん、ファイル名をワークに入れて 削除しようとしても消えません。原因が分からず困っていますが、お願いします。 $w_delf = $logdir.'*'.$mon_pre.'00'.'.cgi'; #----------------------- #$logdirには/var/www/cgi-bin/alog/logs/が格納 #$mon_preには3が格納されている #------------------------ unlink ($w_delf);
unlink <{$w_delf}>; unlink <${w_delf}>; どっちでもいけた。 unlink <$w_delf>; これはダメだった。
LWP::UserAgentは、エロサイトから画像をダウンするスクリプト作って覚えた。 エロヂカラ偉大。
418 :
デフォルトの名無しさん :2006/06/23(金) 15:44:03
>>416 ありがとうございます。
試してみます。m(_ _)m
仕事で、勉強の時間をほぼ1ヶ月与えられてる訳だから、優しい会社だよね。 俺の場合は、海外アプリの7割書き換えが仕事で、納期は入社して4日後だった。 プログラムできなかったら死んでたと思う。
できなかったらそもそも入社できなかったんじゃないの
windowsのcmd.exeでワンライナーがくそ使いにくいのだけれど 日本が使えるまともなシェルを別に使ってる人いますかね?
>>421 NYACUS使ってる、けどワンライナーはあまり書かないな。
Socketモジュールを使って2chのsubject.txtをGETしようとしているのですが、 内容を見るために while (<SOCKET>){ print $_; } を書き加えると動作が途中で止まってしまいます。 コードは以下のとおりです。ActivePerl5.8.8です。ほかのサイトも試してみましたが同じような結果になります。 use Socket; $server="news20.2ch.net"; $iaddr=inet_aton($server); $sock_addr=pack_sockaddr_in($port,$iaddr); socket(SOCKET, PF_INET, SOCK_STREAM, 0); connect(SOCKET, $sock_addr); select(SOCKET); $|=1; select(STDOUT); print SOCKET "GET /news/subject.txt HTTP/1.1\n"; print SOCKET "Accept-Encoding: gzip\n"; print SOCKET "Host: $server\n"; print SOCKET "User-Agent: Monazilla\n"; print SOCKET "Connection: close\n"; while (<SOCKET>){ print $_; } どのようにしたら内容を見ることが出来るのでしょうか?教えてください。
>>424 Socketなんて生で使うもんじゃあない。
LWPか、せめてIO::Socketにしとけ。話はそれからだ。
ヒント: 設定が一つ足りない。
print SOCKET "Connection: close\n\n"; これじゃないの?
429 :
デフォルトの名無しさん :2006/06/23(金) 22:16:06
2点のミスと、1点のヌカリがあるわけだな。
次はWindowsサーバでコケそうだな
七転び六起きに一票
>>427 ありがとうございます。まさにそれでした。とーく2ちゃんねるからコピーしたものだったので見逃していました。
>>428 読んでみます。
>>429 とりあえず\nを追加したら見れるようになったのですがほかの2点のミスとは何でしょうか?
欠陥のあるプログラムにはしたくないので教えてください。
433 :
デフォルトの名無しさん :2006/06/24(土) 15:38:22
python の os.path.commonprefix() みたいなことができるモジュールはperlにありますか? 文字列の配列を渡すと、それらの文字列の共通するプレフィクスを調べてくれるような関数です。
>>417 おまえは俺か
001.jpg,002.jpgって連番になってる画像を落としてたな
435 :
433 :2006/06/24(土) 17:25:31
# なさそうなので作ってみましたが、最適化できそうな部分や、 # もっといい方法あったら教えてください。 # 文字列スプリットして一文字ずつ調べるのって無駄? sub get_common_prefix{ return $_[0] if @_ == 1; my $min_len = length $_[0]; my @a = (); foreach (@_){ push @a, [split "", $_]; my $len = length $_; $min_len = $len if $len < $min_len; } my $first = shift @a; my $r = ""; for(my $i = 0; $i < $min_len; $i++){ my $c = $first->[$i]; foreach(@a){ return $r unless $c eq $_->[$i]; } $r .= $c; } return $r; }
教えてください。 コマンドラインオプション-lについてです。 このオプションは-nや-pと一緒に使うと、ループブロックの先頭で chompをするという機能があるということなので、 perl -lpe "" xxx.txt とコマンドを実行してみましたが、普通にxxx.txtの内容が出力されました。 特に改行文字が削除されているようでもなく、ファイルの内容がそのままという 感じです。 何ぜに改行文字が消えないのでしょうか?
>>436 -lは同時に$\を設定するので、元通りになったように見えているだけ。
マニュアルよく嫁。
>>435 Python全然知らないけど、それだと意図した動作をしないような気がするぞ
("abc", "ab", "cde");
を渡すと、"ab" が返ってきそうだ。
"" にならなきゃいけないんだよね。
>>438 それはちゃんと "" がかえります。
後半のfor に処理が到達した時点で。
$first = ['a', 'b', 'c']
@a = ( ['a', 'b'], ['c', 'd', 'e'] )
となってて、$iが現在注目するindex;
一番内側のforeach で、$c ( = $first->[$i] )と、@aがもつ配列群それぞれの同じindexの文字を比較してます。
unless $c eq $a->[0][0]; を比較した後、チェックするのは、
unless $c eq $a->[0][1]; ではなく $a->[1][0]; です。
「 全ての配列の同じindexの文字が、全部同じ場合にのみ 」 その文字はプレフィクスとして確定。
一つでも異なれば必ず$cとの比較で違いが出るので、そこで終了riturnnです。
挙げてもらった例だと、 $firstの最初の'a' と、3つめの最初の'c'を比較した時点で不一致になるので、
一文字も確定とならずに ""となります。
>>438 ab が返ってくるみたい。
os.path.commonprefix は知らないんだけど、単純に前方から一致する文字列を
返せばいいのかな。それとも / や \ 等のデリミタも考慮するのかな。
441 :
440 :2006/06/24(土) 20:59:24
おっと、ミス。 s/ab が返ってくるみたい/"" が返ってくるみたい/
>>440 単純に前方の一致部分です。
文字列の最初の数文字だけ比較すれば済む($min_lenで高々何文字かは絞られる)ので、
文字列を全部 split するのは無駄な気がしてます。
splitせずに一文字ずつ見ていければいいのですが、やりかたがわからない。
substrとかでがんばるしか
sub get_common_prefix { &npbs;&npbs;my $buf = join "\n", @_; &npbs;&npbs;my $repeat = scalar(@_) - 1; &npbs;&npbs;$buf =~ m{(.*)(?:.*?\n\1){$repeat}}; &npbs;&npbs;$1; } やりすぎですか、そうですか。
とても…読みづらいです
うお、nbpsの綴り間違えてコピペしたorz ついでに^忘れスマソ sub get_common_prefix { my $buf = join "\n", @_; my $repeat = scalar(@_) - 1; $buf =~ m{^(.*)(?:.*?\n\1){$repeat}}; $1; }
>>446 揚げ足とるようでスマソ・・・・
文字列自体に改行が含まれる場合はまずいかも
例えば ("abc\nabd","zz") だと ab を返してしまう
素直にこんな感じで。 sub get_common_prefix { my $prefix = shift; while (length($prefix)) { last if (grep(!index($_,$prefix),@_) == @_); chop $prefix; } $prefix; }
>>447 あら、入ってくるのファイルパスだけだと思ってたけど、よく読んだら"文字列"なのか
450 :
デフォルトの名無しさん :2006/06/25(日) 07:38:00
質問です。 配列の要素数に上限ってありますか?
言語仕様的には無い。 メモリの許すまでOK。
452 :
デフォルトの名無しさん :2006/06/25(日) 08:38:07
俺も初めて真剣にperl勉強しようと思ったのは 大量のエロ画像の山を前にした時だったっけか htmlからリンク抜き出して、urlを加工して、 その過程で正規表現も習得したんだっけか で、今になってもそのときとレベルはあんまし変わっていない ちなみにおれが始めて作ったアプリはVBでエロ画像のスライドショー 俺は、一体何のために生まれてきたんだっけ?
エロ画像をスムーズに閲覧するために生まれてきたに決まってるだろ。
Spreadsheet::ParseExcelについての質問です。モジュールはPPMで入手しました。
英語で記載したセルとハイパーリンクだけは抽出してくれるのですが、日本語部分が文字化けしてしまいます。
モジュール部分には、以下のように記載しています。
use strict;
use Spreadsheet::ParseExcel;
use Spreadsheet::ParseExcel::FmtJapan;
my $oExcel = new Spreadsheet::ParseExcel;
my $oFmtJ = Spreadsheet::ParseExcel::FmtJapan->new(Code => 'euc'); #sjis、jisなどのコード
Googleなどの検索では、これで上手く言っている人が大部分でした。jperlは5.006がreqされる為、使用できません。
PerlでExcelなどいじるな、と言われそうですが、Excelユーザーが周りに多い為に、
このような手法を使うしかない次第です。モジュールに渡す文字コードの問題だと重い調べましたが、どうにも違うようです。
参考URL:
ttp://search.cpan.org/src/KWITKNR/Spreadsheet-ParseExcel-0.2603/README_Japan.htm お判りになる方がいたら、教えてください。
ふつーに考えればeucじゃないんじゃね?
>>456 さん
そうですよね。モジュール正しく入れたか、セルの参照の仕方ばかり見ててうっかりしてました。
FmtJapan->new(Code => 'sjis');
で、スムーズに表示されました。何やってんだ、俺。。。
人様の時間まで使って申し訳ありません。ありがとうございました。
ActivePerl v5.8.4で動作を確認したスクリプトをppでパッケージすると次のようなエラーが出て動きません >Can't locate PerlIO.pm in @INC (@INC contains: CODE(0xce0534) .) at script/edit.pl line 210. >BEGIN failed--compilation aborted. 何故なのでしょうか? 取り合えず >use Tk; >use File::Basename; >use Encode; >use strict; を使っていてedit.pl line 210は >open DATAFILE, "<:encoding($code)", $filename; です
ppとか知らないけど、とりあえずそのエラーでぐぐったら use PerlIO qw(encoding); を足せっていうのが出て来た。
試してみると上記のエラは出なくなりましたが今度は'shiftjis'を知らんと言われます 思い立ってEncode::JPを使うと今度はppの途中でエラーが出ます >C:\Documents and Settings\main\My Documents\perltool\Trebor_sux>echo "use Encode::JP" >test.pl >C:\Documents and Settings\main\My Documents\perltool\Trebor_sux>perl test.pl >C:\Documents and Settings\main\My Documents\perltool\Trebor_sux>pp test.pl >Can't spawn "C:\Perl\bin\parl.exe": Bad file descriptor at C:\Perl\bin\pp line 372.
foreachをネストしてみたらうまくいきませんでした。こういうのはダメなんでしょうか。 良かったらアドバイスお願いします 2つの配列の内容が同じものがあったら表示するというだけのものです foreach (@sysList) { $curName = $_; foreach (@dirList) { if ($_ == $curName) { print "$curName:$_\n"; last; } } }
>>463 >if ($_ == $curName) {
eq の間違いでしょう
foreach my $curName (@sysList) { foreach (@dirList) { if ($_ == $curName) { print "$curName:$_\n"; last; } } }
>>463 foreach $syslist(@sysList) みたいに、配列が格納されるスカラー変数を分けたらいいんではないでしょうか?
$_ の変わりに$syslistで処理したらうまく行きませんか?
素人推測ですみません。
467 :
463 :2006/06/25(日) 22:15:37
できました! 主原因は==でした。eqにしたら直りました。 配列を格納する変数もforeachの所で書くようにしたらキレイになりました。 ありがとうございました。 foreach my $curName (@sysList) { foreach (@dirList) { if ($_ eq $curName) { print "$curName:$_\n"; last; } } }
foreachじゃなくてforにしときゃいいんじゃね? タイプするのめんどいだろうに
っていうか、ハッシュにぶちこめよ。
>>468 > foreachじゃなくてforにしときゃいいんじゃね?
それは書く人が選ぶ問題。
もちろん君や僕はどちらであっても問題なく読めるし、またそうでなければ Perl 使いを名乗れないけれど、
世の中には「Perl を使わなければならない Perl 使いでない人」というのが多数いて、それらの人々にとっては一般に foreach のほうが読みやすい、という側面もある。
すみません。 if分で、$hogeの中の文字の頭3文字がテスト以外のものを認識したいのですが、 そう言う判定方法ってありますでしょうか?
配列をいじるならforeach ; ; とか 数字..数字が入るならfor それが俺のジャスティス。
>>471 perlと言えば正規表現
if( !($hoge =~ m/^$hage/) ){}
>>473 志村ー!~、!~
ついでに\Q\Eしたほうが良いかも
if ($hoge !~ m/^\Q$hage\E/) { }
ディレクトリにある十個程度のファイルをSJISからutf8に替えたいのだけど、 だれかスクリプト持ってません? ディレクトリ内全部変換でも、ファイル名引数わたしでもなんでもいいです。
nkf でも使えば
nkfかあ。やっぱそれがデフォルトなのかな。
nkfって utf使えたっけ?
$ nkf --help USAGE: nkf(nkf32,wnkf,nkf2) -[flags] [in file] .. [out file for -O flag] Flags: b,u Output is bufferred (DEFAULT),Output is unbufferred j,s,e,w Outout code is JIS 7 bit (DEFAULT), Shift JIS, AT&T JIS (EUC), UTF-8 J,S,E,W Input assumption is JIS 7 bit , Shift JIS, AT&T JIS (EUC), UTF-8 t no conversion i_/o_ Output sequence to designate JIS-kanji/ASCII (DEFAULT B) r {de/en}crypt ROT13/47 h 1 hirakana->katakana, 2 katakana->hirakana,3 both v Show this usage. V: show version m[BQN0] MIME decode [B:base64,Q:quoted,N:non-strict,0:no decode] M[BQ] MIME encode [B:base64 Q:quoted] l ISO8859-1 (Latin-1) support f/F Folding: -f60 or -f or -f60-10 (fold margin 10) F preserve nl Z[0-3] Convert X0208 alphabet to ASCII 1: Kankaku to space,2: 2 spaces, 3: Convert HTML Entity X,x Assume X0201 kana in MS-Kanji, -x preserves X0201 B[0-2] Broken input 0: missing ESC,1: any X on ESC-[($]-X,2: ASCII on NL O Output to File (DEFAULT 'nkf.out') d,c Delete \r in line feed and \032, Add \r in line feed I Convert non ISO-2022-JP charactor to GETA -L[uwm] line mode u:LF w:CRLF m:CR (DEFAULT noconversion) long name options --fj,--unix,--mac,--windows convert for the system --jis,--euc,--sjis,--utf8,--utf16,--mime,--base64 convert for the code --overwrite Overwrite original listed files by filtered result --help,--version Network Kanji Filter Version 2.0 (4/0401/Shinji Kono) Copyright (C) 1987, FUJITSU LTD. (I.Ichikawa),2000 S. Kono, COW, 2002-2004 Kono,Furukawa
>>474 それだと頭の3文字以外に、
真ん中にテストってあってもひっかからないのでは?
482 :
471 :2006/06/26(月) 17:36:56
>>474 上手く動きました。
ありがとうございました。
483 :
デフォルトの名無しさん :2006/06/27(火) 02:33:29
use threads; use threads::shared; my $obj :shared; $obj = MyObject->new(); として、スレッド間でオブジェクトを共有したい場合、どうするべきですか? Invalid value for shared scalar といわれてしまいます。
>>483 threads::sharedのマニュアルぐらい読もうな。
The only values that can be assigned to a shared scalar are other
scalar values, or shared refs, eg
my $var : shared;
$var = 1; # ok
$var = &share([]); # ok
$var = []; # error
$var = A->new; # error
$var = &share(A->new); # ok as long as the A object is not nested
485 :
デフォルトの名無しさん :2006/06/28(水) 07:20:33
定期的に処理を実行させたいと思い、sleep関数使ってテストしてみたのですが 例えば print"おはよう"; sleep 10; print"ございます"; を実行すると、10秒間何も表示されず、10秒後に”おはようございます”と 全文が表示されてしまいます。段階的に処理を行い、途中に待ち時間を 入れるようにするにはどうしたらいいんでしょうか。
syswrite 使う?もっといい手もありそうだけど。 my $len_head = length ( my $head = 'good ' ); syswrite STDOUT, $head , $len_head ; sleep 10 ; print 'morning' . "¥n" ; 「 print 」はバッファに溜め込むんだよね。
488 :
487 :2006/06/28(水) 08:19:03
>>486 ちなみに STDOUT のバッファリングは行単位なので、
>>485 のケースでも sleep の前に \n を吐いてやればそのまま出るんだけどね。
489 :
486 :2006/06/28(水) 08:33:34
>488 捕捉すまん。うろ覚えで書き込むな>オレ。 # 単純に STDERR に出力するとかって手もある。 # sleep 使うんだったらメッセージ系だろうし。
490 :
デフォルトの名無しさん :2006/06/28(水) 10:29:49
>>486-489 ありがとうございます。
早速実行してみたところ、
>>486 、
>>487 さんのやり方両方とも
DOS窓で実行すると順々に表示されて行き、うまく行くのですが、テキストファイルに
出力しようとするとやはり最後にまとめて出力されてしまいます。
(最終的には、データの種類ごとに各テキストファイルに振り分けて、それぞれに定期的に
データの記入を加えていく、というふうにしたいのです。)
sleepとalarmを混ぜて方法もあるようで、以下のスクリプトでテストしてみたのですが
やはり同様に、DOS窓でのみ成功(上の2行を外して実行)、TXTファイルではうまくいきませんでした。
テキストファイルに順次表示していく方法はあるのでしょうか・・・
chdir "c:/program files/files";
open(FILE,">file2.txt")|| die "ERROR\n";
$SIG{ALRM} = sub { print FILE "alarm\n"; alarm 1 };
alarm 1;
while (1) {
print FILE "sleep\n";
sleep 5;
}
select(FILE)して$|=1しなはれ
>>490 486,487のやり方はちゃんと応用すればファイルでもうまくいくはずなので、
たぶん理解しないで直して使い方を間違えているとみた。自分が直した
プログラムをさらしてもらわないとこれ以上はおれにはなんとも。
気になったので >sleepとalarmを混ぜて方法もあるようで、以下のスクリプトでテストしてみたのですが $SIG{ALRM} = sub { print "alarm¥t"; alarm 1 }; alarm 1; while (1) { print "sleep¥t"; sleep 5; } -STDOUT を出力先にし、"¥n" を"¥t" に変更しただけ - これだと望んだ挙動はしません。未だこのスレ観てたら御一考を。
もうuse IO::Handleで my $io = new IO::Handle; $io->fdopen(fileno(STDOUT), 'w'); $io->print('foobar'); $io->flush(); でいいんでねぇの?
>>493 お前正しいですね。
ともあれツッコミサンキュー。
497 :
485 :2006/06/29(木) 04:47:45
>>491-496 ありがとうございます。
とりあえず下記のとおり書き換えてみたらいい感じになりました。
一定時間後にファイル開きなおすとちゃんとその都度ファイルが
書き換わってました。
495さんのやりかたは初心者の私にはまだちょっと分からなくて・・・
申し訳ないです。
追い追い勉強しながら理解していきますです。
chdir "c:/program files/files";
open(FILE,">file2.txt")|| die "ERROR\n";
select(FILE);
$|=1;
print"Good ";
sleep 10;
print"morning\n";
sleep 10;
print"How are you?";
sleep 10;
大変助かりました。本当にありがとうございました。
>>497 ところで、selectしっぱなしで良いのん?
{
my $oldfh = select FILE; # FILEをデフォルトにして、元のを保管
$| = 1; # バッファリングしない設定を変えて
select $oldfh; # デフォルトのハンドルを元に戻す
}
そういう問題もあるからselect+$|よりIO::Handle使うほうがわかりやすいと思うのだがね。
個人用メモ # Effective Perl 60項 より select((select(FILE), $|=1)[0]);
>>500 個人用メモて、
ちらしの裏にでも書いておけwww
ポケットリファレンスのselectの項にも
>>500 が書いてあって感動した
常識をわざわざここに書かれても
正解には「常識であるべき(だが、結構知らない人間もいる)書き方」だな。
結構知らない人間もいる。ということは、 常識ではないような気がするが、気がつかなかったことにして置こう。
506 :
505 :2006/06/29(木) 12:03:27
実は
>>500 のコードが何をしているのか意味がわからない俺ダルシム
$| って現在selectしているハンドルにのみ有効なの?それなら意味わかるんだけど。
507 :
505 :2006/06/29(木) 12:05:47
あっ、「常識であるべき」って書いてたのか。すまん。
常識かどうかはともかく、
>>500 は O'reilly 系のほとんどに載ってるなあ。
しかも不親切な形で。
昔、どこに print 文を挟めばいいのかちょっと悩んだ覚えがある。
>>506 リストの中にプリント文を入れる(んだと思う)。
select (( select(STDERR), $| = 1, print "." )[0] ) ;
どう見ても
>>500 のコードが素晴らしいと思えないんだけど…。
一行で分かりにくく書いただけでしょ。
510 :
508 :2006/06/29(木) 12:08:26
あ、すまん。508 のポインタは忘れて。 >$| って現在selectしているハンドルにのみ有効なの そうだよ。
>>509 そう思うなら
>>498 みたいに無駄に1個変数を用意すればいいじゃないか。
There's more than one way to do it.
STDOUT以外にprintするときはファイルハンドルを明示するのが俺のジャスティス
ああそう
ようやく理解した lispっぽいな
515 :
505 :2006/06/29(木) 13:20:08
>>510 おー、なるほど。それならば結構、実用的。
俺が const char* aho = strcpy( new char[0xBaca], "aaaa" ); //newしつつ文字列代入
を思いついたときのコードに似ているな。
0xBacaはメモリとりすぎだがな。
関数に次のような引数を渡して受け取りたいのですが、@cvsの配列の数が まちまちです。 どのように受け取ればよいでしょうか? &test($filename, @cvs) sub test($@) { my $file = $_[1]; my @cvs = $_[2]; #これだと一行しか受け取らない }
sub test($@) { my $file = shift; my @cvs = @_; }
my($file, @cvs) = @_;
>>517-518 すみません、やってみたのですが、なぜか
$file に Hoge=HASH(0x99b7dg0)
@cvs に
ファイル名
@cvsの中身となってしまいます...
???
521 :
デフォルトの名無しさん :2006/06/29(木) 14:09:46
正しいかわかりませんが、とりあえず、以下のようにして対応してみました。 my($hash, $file, @cvs) = @_;
$hoge->mara($ga, @moe) って呼ぶのは &mara($hoge, $ga, @moe) のように呼ぶのと似たようなもん。
うひ〜 崖を転げ落ちてるな、このスレは。
あー、そういうことですか。 んー、ちょっと難しい仕様ですね。
お前が最初にこうやって呼ぶとかウソを書かなければ 適切な回答ができたのだがな。 &test($filename, @cvs)
しかしまぁ、blessだの何だの知ってるのに サブルーチンでの値の受け取りが分からないって…。
my $file = $_[1]; my @cvs = $_[2]; これでまだ$_[0]があることを想像しろなんて無理。 しかもプロトタイプが$@だし。
やっぱこれで「オブジェクト指向で書いてます」とか言っちゃうのかなぁ
まあ、下を見てるときりがないです。 それに、下ばかり見ていると、自分もどんどん下がっていきます。 上に行くことを目指しましょう。 上に引っ張りあげることを考えましょう。
@_@; てかそれに、@csvはどう考えても参照渡しにすべき というかなんというか
531 :
460 :2006/06/30(金) 01:13:38
>>462 は環境の問題だった様で
>>461 で解決しました有難うございました
追記:'shiftjis'等を使うには明示的にuse Encode::JP;が必要なようです
>>525-530 勉強不足ですみません。
どうしてこんなあほな質問がでるのか不思議な様子なので説明をば
perlでオブジェクトを使うのは初めてで、PHPの感覚で$obj->method(), method()でも
受渡しは、同じだろうと思っていました。
blessとかは意味はわからんのですが、Perl&CGIリファレンス本に書いてあった
のをそのまま使っています。
でも本を読んでも意味がよくわからんです。
元々オブジェクトとか考えられていなかったから、こういう仕様なのかなと
勝手に思ったのですが、どうなんでしょうか。
そこでPerl6ですよ。
そんないつ出来るか分からないものを挙げられてもなぁ
ヒント:Pugs
pugsなんて一体何人使ってるんだ…
こういう話題になるとすぐ、perl6とかPugsとか言う人は 当然自分でもPugsでperl6してるんだよなぁ。 じゃなきゃ説得力ないんだけど。
何で説得力を求めるのか意味不明
PerlでOOPやりたいなら、まともに対応するPerl6を待てば? 待ちきれないなら Pugs を試してみれば? っていう、ただの示唆じゃね
おまえら
>>532 は十中八九 php でも OOP スクリプトは書けてないで
あろう事に気づけ。
>>532 何が言いたいかわからんが、受け渡しは同じだと思うが?
PHPってオブジェクトのメソッドである $obj->method(); を method(); って呼ぶとオブジェクト補完してくれるの?
第一引数がオブジェクト自身になるのなんてPerlだけだろ
取って付けたようなオブジェクト指向だしな
>>543 × 取って付けたようなオブジェクト指向だしな
○ 取って付けたオブジェクト指向だしな
>>542 そんな事はない。
例えばPythonは結構なOOPLだけどメソッドの第一引数にインスタンスをとる。
>>545 Pythonもそうなのですか。
でもたいていの言語はthisのようなキーワードを用いるか、省略してもいいという風になっていますよね。
perl 5.8.6 で XML::RSS を使って Podcast 情報を取得しようとしていますが、 enclosure url が引っ張り出せません。 XML::RSS では出来ないようなのですが、他に enclosure url が取得できるものは あるでしょうか。m(_ _)m
ふとPugsを入れてみようと思い立ったんだが make test がいつまでも終わらない…。 CPUもほとんど100%使い切ってるし、こんなもんなの?pugsって。 めちゃプロセス重い。
俺の場合、メチャメチャ時間くったよ。 環境は OSX 。 インストールが終ったあとバイナリーパッケージみつけてへこんだw
>>549 1時間以上かかってやっと終わった。
バイナリはあったけどコンパイルしたかったw
1万くらいテストがあるから時間がかかるという事のようで…。
セットアップからmake, make test, make installまでで3時間。長かった。
できあがったものを動かす分には、今の所、問題無し。
同じく環境はOSX。
しばらくperl6で遊んでみます。
昔Pugs入れようとおもってソース落としたら、妙にHaskellに興味を持ってしまって今はPerl6どころじゃなくなった。
スレ違いを承知で聞かせてもらうが 関数型言語を学ぶメリットはあるのか? たんなる「頭の良い人」向けの言語っていうだけじゃないの? Haskellで実用的・業務的なプログラムを書けるの? 何?変数がないんだって?意味わかんないYO
PugsってHaskell使って2ヶ月ぐらいで作られたらしいから 生産性は高いんじゃないかな 多分・・・ まあ2ヶ月ってのはAudreyだからだろうけど
>>553 > スレ違いを承知で聞かせてもらうが
> 関数型言語を学ぶメリットはあるのか?
楽しいから学ぶ。学びたくて学びたいから学ぶのだ。
「おおなるほど!!」「これはすごい!!」「そうだったのか!!」
と驚きたいから学ぶのだ。
>>553 発想の転換を促すには良いと思われ。
だからどの言語でも同じようにしか書けない人には意味ないかも。
(PerlでCっぽく書く人にはムカつくんだよ!)
関数型言語の中ではHaskellが一番取っ付きやすいように感じたけど、まあその辺は人それぞれだ。
スレ違いなんだが、 まぁ、関数パラダイムが普及することは絶対ないわな だって難しすぎるから 普段VBとかで適当なアプリ作ってる人たちにHaskelll 習得させようとしたら窓から逃げる人が続出だな
Prologが苦手なのでHaskellもとっつきにくいなぁ
>>557 でもさあ、それはプログラミングな業界が今と同じ形態をとっていることを
前提にした意見だろ?
「Haskellおもすれー!」っていう頭の良い人たちが「平均的なプログラマー」に
なったら、それはそれですばらしいと思わないかい?
ありえんな。年々馬鹿になってるから。 まあ言語が進化したおかげで プログラマへの要求が低下して底辺が拡大してるからだが。
>>559 それがプログラマにとって素晴らしい世界か?
頭の良い人たちの絶対数はそうそう変化しないだろう
つまりそういう人たちが平均的なプログラマになるということは
圧倒的大多数の能無しプログラマが死滅したということだ
てか本当にこれからプログラマになろうという若人たちはあわれだよな
Javaにせよ.NETにせよCPANにせよ
既存のモジュールをインクルードしてnewしてメソッド呼び出せば
それですべて事足りて、
何も根本的な技術は身につかずに、
なのに一部の優秀なプログラマさんたちがどんどん新手の概念やモジュールを
発行し続けて、
これじゃまるでブランドのバッグの新作を買いつづけて破綻するOLじゃないか!
搾取され続ける消費者でしかない
みんないいかげん気づこうぜ!
ヨーロッパの革命の時代、庶民は団結して王族をタタッきった
それは王族どもの搾取があまりだったからだ
自らの生存と平定の世のために民衆は立ち上がった
そう、今俺たちプログラマのおかれる状況も同じだ!
誰だ?誰のせいだ?!誰がこんな状況に俺たちを追い込んだ??
そう!!ゴスリングだ!オードリだ!弾だ!!あいつらだ!!
あいつらが悪なのだ!
個人的には超絶的な人達と、全然プログラムしない人達に別れて行くのが理想。 誤解受けるかも知れないけど。 プログラマ的にはプログラムを書きたくない。 プログラムを書かなくて良い世界って素敵だと思う。 だから今のMovableTypeやTypePadでのブログの流行とか、ああいうのは賛成。 プログラムなんて知らない。HTMLなんて知らない。で良いと思う。 Haskellみたいな難しい言語ができて、そういうプログラマ人口が増えるってのは ちょっと後退かなと考えてる。 チラ裏すまん。
おまいら、ここは質問箱ですよ
正規表現でeval使わないでマッチ演算子を変数で指定する方法ってどうすればよかと? Jcode.pmのソース見るとeval使ってるんだけど実行時コンパイルで遅いから使わない方法を模索してます。 match('abcdefgfedcba', 'b', 'ig'); sub match { my ($str, $pattern, $opt) = @_; $str =~ /$pattern/$opt; } みたいなことをしたいっす。 XS使ってperl apiを呼ぶしかないかな? よろすくおねがいします。
素直にeval使いなよ。 evalより、XSをリンクするコストの方がかかる。
>>564 perlreの(?imsx-imsx:pattern)の項嫁
後ついでにperlopのqr/STRING/imosxも読んでおくと良い
マッチ演算子の数は有限なんだから$opt解析して場合 わけしちゃえば? w
じゃ、
>>566 の線でgだけ場合わけてーのはどーよ
>>568 いや、XSのコードは、最初にuseする時にコストがかかる。
そのリンク先のベンチは500万回実行してるけど、
回数少なければXSの方がトータルで遅いはず。
evalは2回目以降はコストほぼ一定だし。
何百回も実行されるコードじゃないんだよね。
しかも、やろうとしてる事は単なるインクリメントじゃなくて、
正規表現なんでしょ?
だったらほとんど変わらないと思う。
XSを勉強したいという事なら別に止めはしない。
けど多分、苦労に見合わない。
cpanのRegexpというのがまさしくそんな感じのモジュールだがどうよ。
>>569 #g以外にも指定できない演算子があるし置換演算子のeも指定できないので
567さんの意見を却下したのと同じ理由って事で m(_ _)m
>>570 なるほどでっす。
XSは自分でいじったことなくて分かんないんですけど
DynaLoaderからXSLoaderになってコストが安くなったって聞くんですけど
まだまだ重いもんなんっすかね?
perlのインタープリタの起動自体が重いのでロード時の重さってよほどでない限り
気にしたことなかったす。
EncodeやらDBIやらPOEをいつも使ってるから麻痺してるのかも Σ(゚д゚;)
あと、WEBから利用する場合も標準でmod_perlを利用しちゃってるので
起動後はキャッシュされるので気にしたことなかったっス。
丁寧に説明ありがとうございます。
ここまで来たらXSの勉強のつもりで往ってきます。
>>571 おぉ!!XSから正規表現をいじるサンプルコードだ!!
どうもですぅ!!
eval で出来ることをわざわざ…。 完全に目的と手段を履き違えてるな。
>>実行時コンパイルで遅いから って理由がちゃんと書いてるよ それに同意できるかどうかは別だけどね。 おまいさんはRegexpモジュールも否定すんのか? まぁ、このモジュールを利用する最大のメリット coreをhuckせずに機能を自由にオーバーライド出来る点だけどね
575 :
デフォルトの名無しさん :2006/07/02(日) 21:15:29
>>564 が、正規表現中で 「 | 」使ってたりしたら笑えるん
だけど。
ああ、あげてしもた。吊ってくる。
>>575-576 話についてけないなら無理に書きこする必要はないんだよ
おとなしくROMってな、房や
いやevalのコストを気にするくらいだったら当然正規表現 中の「 | 」のコスト高はしってると思ってさ。 速度を気にするときの基本って意味でパイプを例にだした だけなんだ。
おれは最近知った>パイプw まあ、そんなに速度は気にしないからパイプもevalも 必要に応じて使ってるけど
まぁ、他にもいろいろモジュール使ってるみたいだから evalのコストくらい結局吸収されちゃうと思う。
ところでお前ら本当にスタンドアロンで動くプログラム組んでるの? ぶっちゃけcgiとしてしか使ってないんじゃない? 俺の周りでperlでWindowsやUNIXや組み込みプログラム組んでるの見た事ないんだけど… せいぜいインストールスクリプトくらい。 ム板に居座る為に口実であくまで非cgiとして使ってる事にしてるんじゃなかろうな?
ごめん。おれ cgi 書いたことないw
俺の場合CGIはほとんど無し。 ワンライナー多数。 仕事では死ぬ程たくさん書いた。全部CGIじゃなかった。
漏れは小物では、日常的なデータ―特に文字列が多いが―の変換とか、 スタンドアロンじゃないがSubversionのフックスクリプトとかPerl製。 Un*x環境では鯖の管理スクリプトを時々頼まれて…CGIも結構作るがね。 最近のスタンドアロン物だと、ウェブから仕入れた法文をPalm用に変換・整形するツールを作ってる。 しかし、こうやって考えてみると、その場で使って棄てるような小物が多いから、 見せられるようなものってあんまり無いなー
>>570 「evalは2回目以降はコストほぼ一定だし。」
詳細は perldoc -f eval
564がマッチング演算子まで変数で指定できるように
しようとしてるわけだからevalでやろうとすると
eval BLOCKではなく eval EXPRになる。
この場合は毎回式を評価してから実行となる。
>>580 モジュールを沢山使用することによる初期コストは
どんなに大量にデータを処理しても一定なのに対して
evalはデータ処理のループの回数だけ実行されて積み重なる。
perlスクリプトでのCGIで簡単な処理しかしないなら
インタープリタの起動コスト、モジュールのコンパイル
XSへのリンクコストが気になるのかもしれないが
バッチ処理での大量のデータの処理などは初期コストの数秒より
積み重ねの数時間のほうが大いに気になる。
CGIでしか利用していないならWebProg板に往きなさい。
perldocにある通り、評価は毎回かも知れないけど、
evalって評価器の立ち上げにコストがかかるんじゃなかったっけか。
>>570 とかの言ってるコストってそっちじゃないの?
おれの覚え違い?ひょっとして。
>>587 564は572で「あと、WEBで利用する場合も」とついでに説明だしてるだけだし
初期コストより実行時コストを重視してる言い回しだろ。
日本語読めてんか?
Rock54とかBBQ、sv2chはCGIも混在。 仕事ではエクセルでちまちま数字打ち込むよりかはテキストファイルですぱぱぱぱと描いて、 適当に変換してエクセルに貼り付けたり。
ここはプログラム板でCGI,WEB以外も範囲に入るのに
564へのレスがCGIでの使用を前提としたような反応が多いね。
最たるものが
>>573 は目上からの物言いをしてるけど
実はこいつが見当違いなレスをしている。
>>581 CGIがメインさ。CGIがメインでもいいじゃないか。メインでもいいじゃないかコノヤロウ。
>>564 つかさ。コストがかからないようにevalすればいいじゃないの?
sub newRegExp{eval("sub{\$_[0] =~ /$_[0]/$_[1]}")}
local *regexp = newRegExp('b', 'ig');
print regexp('abcdefgfedcba'), "\n";
print regexp('AbabaAbabaAbabababa'), "\n";
print regexp('baka! ...demo suki!'), "\n";
まあ、↑じゃ使いにくいだろうからちょっと改造が必要だろうが。
無名サブルーチンをevalで作るわけね。 じゃあこんなのはどうかね。 my %opt_hash; sub match { my($str, $pattern, $opt) = @_; unless (defined $opt_hash{$opt}) { $opt_hash{$opt} = eval qq{ sub { my(\$s, \$pat) = @_; \$s =~ /\$pat/$opt; } }; die $@ if $@; } $opt_hash{$opt}->($str, $pattern); }
あ、無名サブルーチン内の@_の@をエスケープしてないや。 テストしてないのがバレバレだな
>>592 おー、同じマッチ演算子だったらキャッシュするようにしたのね。
でも、正規表現のパターンが違うと毎回正規表現のコンパイルが、
走りそうだけどしょこんとこどうなの?
>>591 はそれを考慮してパターンとマッチ演算子をセットにしたコードにしてみたんだけど。
うーん、そこ迷ったんだよな。呼ばれたサブルーチン側からは 元のパターンが文字列埋め込みで変化するものか固定文字列か わからないので。 それによく考えたらこれじゃoオプションがまともに使えないね。 いまいちでしたorz
591のはRegexpみたいにそれだけを専用にするモジュールのコード向き。 592のはJcodeのmメソッドに組み込むコード向き。 と、勝手に俺は感想を持った。
つい最近デバイスをバシバシ叩くやつを作った。
598 :
デフォルトの名無しさん :2006/07/03(月) 16:56:42
ActivePerlのライセンスってどうなってるの? Perl.dllとかを自分のアプリに組み込むのはアウトなの?
599 :
デフォルトの名無しさん :2006/07/03(月) 19:27:16
質問をさせてください 当方Mac OS X(10.4)でThis is perl, v5.8.6 built for darwin-thread-multi-2levelを使っています. ttp://mrmt.net/src/omnioutliner/index.html omnioutliner-opml2htmlという,OmniOutlinerというアウトラインプロセッサで作ったファイル をXMLで書き出したものをHTMLに変換するPerlスクリプトなのですが,スクリプトを実行すると, Not an ARRAY reference at omnioutliner-opml2html.pl line 55. とエラーが出ます. line 55周辺を見ると, for my $item (@$data){ #ここがline 55です &dump($item); } とあり,@dataにはXMLに手を加えたものを一行ずつ配列にしたものが入っています. このエラーメッセージで検索をすると, " Perl が配列値へのリファレンスを評価しようとしましたが、別のものへのリファレンスでした。" とありましたが,何がおかしくて,どう修正すれば良いのかわかりません. 何かヒントをいただけないでしょうか
>>599 $data の出所を探してみよう♪
どこかでリファレンスじゃなくなっているところがあるかと♪
Posdata:
5.8.6-2からなかなか更新しないですよね(怒)@膜真珠
leopard(10.5)まで待たなきゃなんだろうか。。。
>>599 ソースみたけど、ハッシュへのリファレンスを、配列としてデリファレンスしてる。
for my $item (values %$data){
&dump($item);
}
ってすれば多分おk
>>599 forの前で
warn $data;
ってするとどうなる?
ARRAY(0x8182c30)
とかってでる(括弧の中の16進数は毎回変わる)?
603 :
601 :2006/07/03(月) 19:42:52
あ、ごめ 見間違えたわ $info だと思ったら $data か
604 :
601 :2006/07/03(月) 19:44:57
あ、でも どっちにしろ同じ事っぽいから
>>601 で動くと思う 連投スマソ
605 :
599 :2006/07/03(月) 20:33:58
みなさん,レスありがとうございます.
>>600 ,601
アドバイスありがとうございます.
ハッシュの値を参照すべき箇所が配列の要素を参照してしまっているという事ですね?
>>601 の通り書き換えてみました.すると,
隈鐚") as a HASH ref while "strict refs" in use at omnioutliner-opml2html.pl line 72.
とエラーが出ました.エラーの行は,
print $item->{text};
です.シンボリックリファレンスのエラーの様ですが,何故エラーなのかわかりません.
use strict;をコメントアウトしてもエラーが出ます.
>>602 何度実行しても以下のメッセージになりました.
HASH(0x191c890) at 2omnioutliner-opml2html.pl line 56.
もう少しヒントをいただけないでしょうか
どうもこのプログラムが仮定しているのとは違うxmlを食わしているような 気がする。バージョンアップとかでファイル形式かわっちゃったけど追随 してないとかそんなのを疑ったほうがいいかも。 短いプログラムなのでやろうとしていることを理解してxmlとにらめっこ すれば修正できるんじゃないか。頑張れ。
HASHのリファレンスになっているようだから、、、 for my $item (@$data){ &dump($item); } を、、、 &dump($data); というように直接食わせてみてはどうだろう? tu-ka、606氏と同じような気がしてきたかも。。。
こゆときは、、、 for my $item_hashref (@$data){ と書いてあると「ハシュのリファレンスを取り出しているんだ」って云うのが、後からでも判るんだけどなぁ。。。
609 :
602 :2006/07/03(月) 21:45:36
流し込むデータがないからSyntaxしか確認してないけど これでどう(長すぎるから複数回に分けてカキコします)? ---- #!/usr/local/bin/perl -w use strict; use XML::Simple; use Data::Dumper; use HTML::Entities; my $xml; { local($/) = undef; $xml = <>; } my $info = XML::Simple::XMLin($xml); my $data = $info->{body}->{outline}; ---- まだ続きます
610 :
602 :2006/07/03(月) 21:46:56
PAGE2
----
print qq(
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
<html xmlns="
http://www.w3.org/1999/xhtml ">
<head>
<title>$info->{head}->{title}</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style type="text/css"><!--
div.note { font-size: small; background: #ffd;}
--></style>
</head>
<body>
<h1>$info->{head}->{title}</h1>
\n\n);
&dump($data) if $data;
print "</body></html>\n";
exit;
----
まだ続きます
611 :
602 :2006/07/03(月) 21:50:37
PAGE3
----
sub dump{
my $item = shift;
print "<ul>\n";
if ( ref($item) eq 'HASH' ) {
print '<li>';
print $item->{text};
print qq(\n);
if(defined $item->{_note}){
print qq(<div class="note">\n);
local $_ = $item->{_note};
s/\n\n/<p>/g;
s/\n/<br>/g;
unless(s,(
http://[!-;=-\177]+ ),<a href="$1">$1</a>,g){
s|(www\.[!-\177]+)|<A HREF="
http://$1 ">$1</A>|g;
}
print;
print qq(</div>\n\n\n);
}
----
まだ続きます
612 :
602 :2006/07/03(月) 21:51:42
PAGE4 ---- &dump($item->{outline}) if $item->{outline}; } elsif ( ref($item) eq 'ARRAY' ) { &dump($item) foreach @$item; } print "</ul>\n"; } __END__ ---- ここまで。 うまく動かんかったらサンプルデータをうぷってくれ。 テストできん。
>>599 できた。OmniOutliner インストールして、リリースノートをOPMLで吐き出して
HTMLを確認したから大丈夫だと思う。
55行目から以下の3行を削除して
for my $item (@$data){
&dump($item);
}
次の一行に書き換える。これだけ。
&dump($data);
一応、diff も置いとく。
55,57c54
< for my $item (@$data){
< &dump($item);
< }
---
> &dump($data);
ActivePerlのupdateって上書きインストールでいいんですか? 一度アンインストしてからですか?
615 :
599 :2006/07/03(月) 23:04:54
みなさん,本当に親切にありがとうございます.
>>613 わざわざソフトのインストールまでしていただいてありがとうございます.
diffコマンドで
>>613 と同じ結果が返ってくるのを確認してリソースノートを
このスクリプトでhtmlに変換できました.
>>602 多くの手直しありがとうございます.
文法は問題ないのに実行すると
Deep recursion on subroutine "main::dump"
とエラーが出て処理が終わりませんでした.
ファイルを読み込ませる時/回している時にエラーが出ているのかもしれません.
もう一度その辺りのスクリプトと読み込ませるファイルを確認してみます.
その他助言を下さった方,ありがとうございました.
私ももっとPerlを理解できる様になったら,皆様の様に人にアドバイス出来るように
したいと思います.
#リソースノートのファイルではうまくいったものの,違う幾つかのファイルはエラーが
#出ました.変換前のファイルとこのスクリプトをもっと見比べてみようと思います.
616 :
デフォルトの名無しさん :2006/07/03(月) 23:15:28
アホな質問ですみません。
簡単なCGIを作りました。コマンドラインからは実行でき、正常終了します。
ところが、これをブラウザから実行する方法がわかりません・・・_| ̄|○
とりあえず、ブラウザurl(
http://hogehoge/cgi-bin/test.cgi )を打ち込むと
スクリプトが実行されず、ブラウザに表示されるだけです・・・
IISの設定、OSの設定などが必要なのでしょうか?つまらない質問ですみませんが
どなたかご教授頂ければ幸いです。
618 :
602 :2006/07/03(月) 23:35:47
>>615 めんご、やっぱテストしてないからRuntimeエラーおこしたかw
最後のほうの
&dump($item) foreach @$item;
って書いてるのを
&dump($_) foreach @$item;
と書き直しておいて。
619 :
599 :2006/07/04(火) 00:12:28
>>602 ありがとうございます,修正したらちゃんとスクリプトが動きました.
ただ,出力したhtmlに余分な"¥n"という文字が入ってしまっているので,
その部分をsplitすると問題なく表示できます.
みなさん,本当にありがとうございました.
>616 OSはWindowsかな? CGIはサーバー上じゃなきゃ動かない。 Windowsなら、Apacheとかを入れてサーバー環境にしないと動かないよ。 617さんも言ってるけど、WebProg板で聞いた方がいいと思う。
自分でデバッグしてない奴の相手するのやめないか?
622 :
602 :2006/07/04(火) 00:40:47
漏れ? 自分で1回も動かしてないソースを貼り付けてしまいましてすんません…
>>621 つ〜か、デバッグする方法と手順をまず教えようぜ。
かといって perl には初心者スレもないしなあ。
ああ、あっちにはあったのか。 CGI しねえから WebProg なんて行ってなかったw
>>625 まあいいではないか。もっと心を広く持とうぞ。
でも大きな塊でうごかねーとか出してきてさっぱり切り分けできてねーじゃんという のが最近目立つような気がするのも確かだ。
どうしてもできないので質問させてください。 DBI1.50、DBD-Pg1.22、ActivePerl5.8.8Build817、PostgreSQL8.1.4 のような環境でPerlを用いてデータベースをいじっているのですが SELECT はできて、INSERT・DELETE ができません。 以下のクエリをコピペして直接DBをいじった場合はできます。 SELECTが出来ているのでDBIがおかしいとかでもないでしょうし。。。 なぜでしょうか?よろしくお願いします。 以下ソース #!C:\Perl\bin\perl.exe use DBI; $dsn = 'DBI:Pg:dbname=soccer;host=localhost;port=5432'; $user = 'postgres'; $password = 'aaaa'; $dbh = DBI->connect($dsn,$user,$password,{RaiseError => 1, AutoCommit => 0}); $query = "INSERT INTO member VALUES ('イングランド', 'FW', '9', 'ルーニー', '1985/10/24', 'マンチェスター・U')"; $sth = $dbh->prepare($query) || die $dbh->errstr; $rv = $sth->execute || die $dbh->errstr; $query = "DELETE FROM member WHERE name = '小野 伸二'"; $sth = $dbh->prepare($query) || die $dbh->errstr; $rv = $sth->execute || die $dbh->errstr; $dbh->disconnect();
>>629 > まあいいではないか。もっと心を広く持とうぞ。
このケースは、「広い心が無数の狭い心を生む」の典型例だ。
質問させてください use base でベースにするモジュールのバージョンチェックはどうやるのが一般的なのでしょうか? 現在は、use base MODULE の他に use MODULE VERSION としています use Hoge '1.1'; use base 'Hoge';
>>631 根本的にpsqlで同じユーザでつないだ場合にINSERT DELETEはできるのか?
ってか postgresユーザってDBのrootじゃないんか?
635 :
631 :2006/07/04(火) 16:17:38
>>634 できます。
PostgresユーザはDBsoccerのオーナーです。
う〜ん。。。
>>631 ソースだけでなくてなんてエラーメッセージがなんて出てるか貼り付けろよ。
エラーメッセージは意味不明な呪文などではなく、
重要なメッセージなんだぞ。
英語だからって逃げてねぇで辞書使うなりWEB検索するなり調べたり汁。
それとプレースホルダーをちゃんと理解して使ったほうがいい。
SQL文の中に値を直接埋め込んでると
SQLインジェクションで痛い目にあうぞ
こんにちは。 FedoraCoreスレにて質問しましたところこちらの方が適していると言われましたので質問させて頂きます。 FC3にてImage::Magickをインストールしようと思いKDDIのミラーサイトから次のパッケージをインストールしました。 ImageMagick-perl-6.2.2.0-2.fc3 ImageMagick-c++-6.2.2.0-2.fc3 ImageMagick-6.2.2.0-2.fc3 次に /usr/bin/convert と実行するとちゃんとコマンドも通り画像も生成できました。 そこで当初の予定であったPerlで画像処理をしようとしたところ500エラーが出てしまいます。 Apahceのログを見ると、「Premature end of script headers: xxx.cgi」と返ってきます。 試しにソースから「use Image::Magick;」をコメントアウトすると500エラーは出なくなります。 これはImaeg::Magickモジュールに問題があると判断してよいのでしょうか。 またどうすればこれらの問題は解決できますでしょうか。 先ほどから延々色々試していますが皆目検討がつきません。 よろしくお願いします。 ■発生環境 FedoraCore3 Apache2+Perl5.8.5
638 :
636 :2006/07/04(火) 16:33:59
>>631 >エラーメッセージ
言い忘れてました。何もでませんでした。
>英語だからって逃げてねぇで辞書使うなり
英語サイトは忘れてました。
>WEB検索するなり調べたり汁。
一週間調べました。(英語サイト以外
>それとプレースホルダーをちゃんと理解して使ったほうがいい。
>SQL文の中に値を直接埋め込んでると
>SQLインジェクションで痛い目にあうぞ
確かにまだ理解して無い。だけど、先走りすぎ。
639 :
631 :2006/07/04(火) 16:34:44
アンカーと名前間違えた。。。
>>637 コマンドラインが使えるならコマンドラインからそのスクリプトを
perl -cw filename
ぐらいは試してるんだよね?
>次に /usr/bin/convert と実行するとちゃんとコマンドも通り画像も生成できました。
上の内容でImageMagickがあるのは分かるけど、
ImageMagickのperlバインディングがちゃんとインスコできてるかどうやって確認した?
コマンドラインから
perl -MImageMagick -e'warn Image::Magick->new'
ってやるとなんて出力される?
コマンドラインから
which perl
として出力された結果とスクリプトのshebangは同じ?
>>638 >>それとプレースホルダーをちゃんと理解して使ったほうがいい。
>>SQL文の中に値を直接埋め込んでると
>>SQLインジェクションで痛い目にあうぞ
>確かにまだ理解して無い。だけど、先走りすぎ。
おまえ質問者なのに助言者に謙虚さがねぇな。
||をorに書き換えてもエラーメッセージでねぇーの?
>>640 めんご
perl -MImageMagick -e'warn Image::Magick->new'
でなくて
perl -MImage::Magick -e'warn Image::Magick->new'
ね
643 :
637 :2006/07/04(火) 17:00:17
即レスありがとうございます。
>>640 コマンドを試した結果以下のように返って来ました。
[root@aa ~]# perl -cw /hoge/xxx.cgi
/hoge/xxx.cgi syntax OK
[root@aa ~]# perl -MImage::Magick -e'warn Image::Magick->new'
Image::Magick=ARRAY(0x8266c28) at -e line 1.
[root@aa ~]# which perl
/usr/local/bin/perl
最後のPerlのパスは「/usr/bin/perl」へもリンクを張っていますので
どちらでも通ると思います。
>perlバインディングがちゃんとインスコできてるかどうやって確認した?
スミマセン; 恥かしながらチンプンカンプンです。
二回目に実行したコマンドが確認したと認識して宜しいのでしょうか。
二つ目のコマンドの返り値がなんとなく怪しい気がします。
ちなみにMagick.pmは次の場所にあるようです。
/usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi/Image/Magick.pm
/usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi/Image/Magick.pm
>>643 ImageMagickのperlバインディングが入ってるのは
>[root@aa ~]# perl -MImage::Magick -e'warn Image::Magick->new'
>Image::Magick=ARRAY(0x8266c28)
でわかった。
>最後のPerlのパスは「/usr/bin/perl」へもリンクを張っていますので
>どちらでも通ると思います。
そっかー、念のために試しても無駄だった?
漏れの力ではこれ以上は問題のスクリプトの内容をみねぇーとわかんねぇな。
できれば加工しないで貼り付けできる?
長すぎれば同じエラーが出る状態を保ったままなるべく削って貼り付けキボン
645 :
637 :2006/07/04(火) 17:11:35
>>644 レスありがとうございます。
ソースはそんなに長くないのでそのまま貼り付けてみます。
#!/usr/bin/perl
use strict;
use Image::Magick;
my $image=Image::Magick->new;
$image->Set(size=>'40x200');
$image->Read("gradient:#ff0000-#0000ff");
$image->Raise('3x3');
$image->Rotate(-90);
$image->Write('temp.png');
print "Content-type: image/png\n\n";
open(IMG,"temp.png");
binmode(IMG);
binmode(STDOUT);
print $_ while (<IMG>);
close(IMG);
unlink "temp.png";
exit;
ちゃんと起動すれば虹色のバナー大サイズの画像が表示される筈です。
Image::Magickのインストール確認で試しています。
Image::Magickが問題ないんなら evalなりなんなりでエラー箇所を特定しろよ
書き込み権限を確認しれ
temp.pngが作られるディレクトリ問題?
649 :
640 :2006/07/04(火) 17:19:02
なにがいかんのかわかんないけど、書き直してみた。 #!/usr/local/bin/perl use strict; use Image::Magick; my $image=Image::Magick->new; $image->Set(size=>'40x200'); $image->Read("gradient:#ff0000-#0000ff"); $image->Raise('3x3'); $image->Rotate(-90); { local $| = 1; print "Content-Type: image/png\n\n"; $image->Write('png:-'); }
650 :
637 :2006/07/04(火) 17:24:37
>>646 >>648 コード自体は別のサーバで実行すると表示されるようなので多分大丈夫だと思います
>>647 755で実行してます。
>>649 やはりだめでした(´・ω・`)
Apacheのログ
[Tue Jul 04 17:22:00 2006] [error] [client 192.168.0.1] Premature end of script headers: xxx.cgi
Image:MagickそのものかPerlがモジュールを探せられて無いのかイマイチ原因が突き止められません
651 :
640 :2006/07/04(火) 17:31:22
chmod +x xxx.cgi してもだめ? 俺のとこでは chmod -x xxx.cgi でエラーメッセージの再現はできるけど。。。 apacheのユーザー分かる?wwwとかだったら sudo -u www -H /usr/local/bin/perl -w xxx.cgi するとどうなる? >Image:MagickそのものかPerlがモジュールを探せられて無いのかイマイチ原因が突き止められません #!/usr/local/bin/perl -w use strict; use Image::Magick; print "Content-Type: text/html\n\nok!";
652 :
637 :2006/07/04(火) 17:40:09
レスありがとうございます。
>chmod +x xxx.cgi
500エラーでした(´;ω;`)ブワッ
エラー内容は同様です
>sudo -u www -H /usr/local/bin/perl -w xxx.cgi
試しに nobody apache 所持ユーザ root の四つで試してみましたが、
全て「セグメンテーション違反」と言われました。
>>651 のソースを書いて同様の操作をするとprint出力がちゃんと返ってきました。
ちなみに
>>651 をブラウザで実行すると「ok!」と表示されました。
てことはImage::Magickは利用可能で問題はソース側ということでしょうか。
でも同じソースで同じバージョンのperlが入った別の鯖だと表示されたのに・・・。
eval でくくっても何も捕捉できないの?
654 :
637 :2006/07/04(火) 17:49:18
>>653 evalで括っても500エラーと同じエラー文が返ってきました・・・。
何が悪いのでしょうか。 Image::Magickに原因があると思ってましたので逆に原因が分からなくなりました
655 :
640 :2006/07/04(火) 17:49:48
セグメントフォルトしてる時点でバインディングのImage::Magickっぽいな…。 最新版のImageMagickのtarボール拾ってきてコンパイルするのはきつい? 漏れもFC3なんだけどkernelもperlもapacheもimagemagickも 自前でコンパイルしちゃってるから637の使ってる >ImageMagick-perl-6.2.2.0-2.fc3 >ImageMagick-c++-6.2.2.0-2.fc3 >ImageMagick-6.2.2.0-2.fc3 を入れるのはちょっと・・・
656 :
637 :2006/07/04(火) 17:54:40
>>655 tarからインスコすることはよくあるので可能ですが、
何か環境が整っていないのかtarでやると警告が返ってきます。
PerlMagickを入れるために
perl Makefile.pm
とやるとMAKEFILEが作成され、
makeを実行すると、最初に「ghostscript」が無いとエラーが出ました。
なのでそれのtarを拾ってきて該当のファイルを入れて再度実行すると今度は
Magick.c: In function `XS_Image__Magick_Animate':
Magick.c:2098: 警告: unused variable `ref'
Magick.c:2093: 警告: unused variable `ix'
のようなエラーが延々出てます。
なので諦めてFedoraCoreの公式からrpmを拾って今使ってます。
あと最新版のリリースが昨日てのも、もしかしてFCとは互換性ないのかなーとかって思ってたりしてます。
>>637 とりあえず
use CGI::Carp qw(fatalsToBrowser);
ってつけて実行してみれ
658 :
637 :2006/07/04(火) 18:01:33
普通は500でもエラー文が出るはずなのに
>>657 を一番先頭に入れても駄目でした。
Apacheのエラー文も同じままでした。
試しに一般ユーザーとApacheのルートフォルダのどちらでも試してみましたが結果は変わりませんでした。
ついでに余計なプロセスが邪魔してるのではと思って試しにrebootしてみましたが同じでした。
659 :
640 :2006/07/04(火) 18:02:54
ghostscriptは俺もインスコした覚えないけど最初のOSインスコ時に 全部いりしたから入ってるっぽ。 yumでインスコでどうよ? あと俺のImageMagickは6.2.5
660 :
640 :2006/07/04(火) 18:04:25
>>657 ランタイムエラーじゃなくてセグメントフォルトだからCGI::Carpじゃ拾えないYO
661 :
640 :2006/07/04(火) 18:08:50
662 :
637 :2006/07/04(火) 18:33:25
今tarから再度インスコしてます。 FCユーザでもしかして同じ症状の方がいらっしゃるかもしれませんので どういう結果でももう一度報告しに参ります。 どうやら足りないファイルがあるようです。 やはり最新版はFC3は眼中にないのでしょうかTT
663 :
デフォルトの名無しさん :2006/07/04(火) 18:34:35
実は今問題となっているスクリプトを実行していない(-300点)
664 :
640 :2006/07/04(火) 18:47:59
>>662 漏れは6.2.8-3のmake testが通んなくてログを追ってるよ orz
665 :
637 :2006/07/04(火) 18:58:17
lfontcnofig,ltiffの2個が恐らくデフォの状態では足らないと思います。 それぞれ最新版をインスコすると解消されます。 rpm -e ImageMagick* にてアンインスコして6.2.8-3に挑戦してます。 何故かアンインスコすると500エラーは解けました・・・。 でも画像の作成もされないようです。。。 何がどうなってるのかポルナレフ状態です orz
666 :
637 :2006/07/04(火) 19:26:52
無事インスコ完了しました。どうもお騒がせしてスミマセン。 結論:Image::Magickがちゃんと入っていなかった。 yum使って入れた前述した3つをアンインスコし、 tarから取ってきた最新版を入れるとちゃんと動くようになりました。 FC3の方は前述の2個のパッケージが不足していますので、 インストール時に先に追加して下さい。(バージョンの関係です) 先ほどのperlのソースで無事表示を確認しました。 スレ汚し失礼しましたm(_ _)m
報告乙!
WebDBマガジンの最新刊naoya氏のperlの連載 前回はcatalystだったけど今回は何?
mod_perl2.0?
宣伝乙
>>637 の人
> print "Content-type: image/png\0x0D\x0A\x0D\x0A";
じゃねーの?
環境はv5.8.7 built for cygwin-thread-multi-64intです。 $ perl -Mbigint -le 'print 2**64' 18446744073709551616 $ perl -Mbigint -le 'print eval {2**64}' 18446744073709551616 $ perl -Mbigint -le 'print eval "2**64"' なぜ三番目のでは表示されないのでしょうか。
手元のポケットリファレンスには書いてあったー
]% perl -Mbigint -le 'print eval "2**64"; print $@ if $@;' Constant(undef): $^H{integer} is not defined at (eval 5) line 1, at end of line Constant(undef): $^H{integer} is not defined at (eval 5) line 1, at end of line コンパイル時になんかやる仕掛けが文字列のevalだとコンパイルするタイミングが 変わって実行時になるのでうまく動いてない感じに見えるが詳しくは俺もわからん。
676 :
デフォルトの名無しさん :2006/07/06(木) 00:13:06
超初心者で困ってます。バッチ処理(これは解決)を実行後に、元のHPでリンクされた urlを新しいブラウザで開きたいのですが記述方法がわかりません。どうすれば良いのでしょうか?
人に聞く前にスレ内に書いてあること読めチンカス。 1を256億回音読して来い。
>>677 失礼しました。perl初心者質問スレと間違えちゃいました。
>>678 おまえ1を読んでないだろ
どこに初心者お断りって書いてあるんだよ?
超初心者ってのはperlでのプログラミングのことでなく
日本語読解力とコミュニケーション能力のことか?
680 :
デフォルトの名無しさん :2006/07/06(木) 07:38:57
Webprogのコーディングスレでも日本語に突込みが入っててバロスw
>>680 じゃ、おまえが676の質問に答えてやれよ
683 :
デフォルトの名無しさん :2006/07/06(木) 08:50:18
みんな仲良く
685 :
デフォルトの名無しさん :2006/07/06(木) 10:03:31
私も超初心者ですみません XPを使っているのですがLocal SettingsのTemporary Internet Filesに入ってるクッキーを 確認メッセージなしにさくっと消すことって比較的簡単にできますでしょうか? WSHやVBSで試みてたのですがこのフォルダの中のものはどうもうまく消せず InvokeVerbを使ってみたのですがそれだと確認メッセージが出て止まってしまうので、 以前少しやったことのあるPerlで作ってみようかなと、 その前にできるかどうかを聞かせていただこうと思った次第にございます
DeleteUrlCacheEntry
687 :
685 :2006/07/06(木) 10:18:18
そ、それはあああああ!! も、もしやVBSのコマンドでは!!!?? またがんばってみます! ありがとうございました!!
688 :
378 :2006/07/06(木) 15:19:50
亀レススマソ
>>380 ScaleをTransformでやってみたもののwidthが1280とかのjpg画像ならリサイズできたけど
2800級になるとリサイズもできませんでしたorz
そもそも画面が真っ黒になってリサイズされないっていうのが謎すぎる・・
マジ行詰りorz
>>676 元のHPをブラウザで開いて↓をアドレスバーにコピペ、エンター。
javascript:a=document.getElementsByTagName('a');for%20(i=0;%20i<a.length;%20i++)window.open(a[i]);void(0);
>688 ローカルな自鯖ではうまくいくの?掲示板に組み込まず、単体のcgiではうまくいくの? 俺の場合は、ローカル・レン鯖で単体cgiは動いたけどね。2112x2816(2.08MB) あと、リサイズしてファイルを上書きしているんだから、ブラウザ出力時はImage::Magick経由しないほうがいいと思う。 print "Content-type: image/jpeg\n\n"; binmode STDOUT; # $new_image->Write('jpeg:-'); open(FH,'test.jpg'); binmode(FH); read(FH,$bin,(stat('test.jpg'))[7]); close(FH); print STDOUT $bin; undef $new_image; exit;
692 :
デフォルトの名無しさん :2006/07/08(土) 00:34:24
すいません、質問です。 <form action="$regist" method="POST" name="myFORM"> とする時nameをもう1個この中にもう1個追加する時どうやって書けばいいのでしょう?
>>692 人の書き込みを無視する奴が誰かに相手にしてもらえると思ってるの?
1を256億回読め
694 :
デフォルトの名無しさん :2006/07/08(土) 01:05:25
DeleteUrlCacheEntryの使い方を教えてくらはい
ヤサシス
すいません。アホな質問ですがお願いします。 Perl5.8では内部の文字コード?がUTF-8であると聞きました。 しかし、日本語のテキストを処理する場合に、 trなどで全角1文字単位で扱おうとすると、 処理対象のテキストがUTF-8であっても、 Encode::decodeを使って $_ = decode('utf8',$_); などとする必要があるようです。これは何故なのでしょうか? このdecodeは何をやってるんでしょう? 具体的には、テキスト中の全角数字を半角数字へ置換するスクリプトとして 以下のような物を書きました。(動きました) use strict; use utf8; use Encode qw/ encode decode /; while (<>){ $_ = decode('utf8',$_); tr/0-9/0-9/; print; }
700 :
698 :2006/07/08(土) 12:00:15
色々検索してうろついてみたらUTF8フラグというキーワードにたどり着きました。 さらにそれで検索してみたところ説明されているページがありました。 decodeは文字列にUTF8フラグを付与するような働きをしているんですね? 検索で出てきたページをもうちょっと読んでみようと思います。 では。お騒がせしました。
701 :
デフォルトの名無しさん :2006/07/08(土) 12:22:17
間違えた。
>>699 × 2行目は余計。
○ 3行目は余計。
ワラワラ
706 :
698 :2006/07/08(土) 17:44:00
ワラワラ
シクシク
あるサイトで #!/usr/bin/perl -w use Tk; use Tk::JPEG; $mw = MainWindow->new; $mw->title("JPEG image"); # キャンバスを定義 $can = $mw->Canvas(-width => 200, -height => 200) ->pack(); # GIFイメージの読み込み $stop_sign = $mw->Photo(-format => 'jpeg', -file => "stop.jpg"); # イメージの描画 $can-> createImage(100, 100, -image => $stop_sign); # MainLoop; というサンプルを見つけたのですが実行しても Tk::JPEG object version 800,023 does not match $Tk::JPEG::XS_VERSION 800,024 at C:/Perl/lib/DynaLoader.pm line 225. というエラーでが出て動きません どうすればいいのでしょうか
711 :
デフォルトの名無しさん :2006/07/09(日) 07:22:26
質問です。 条件文の配列を $list=($a > 5,$b =~ /a/,$c <= 300) として、これを気持ち的にはif($list[0]){〜〜}、if($list[1]){〜〜}という風に 使いたいのですが、うまくいきません。 条件文の配列の要素(=条件)をプログラム中で使いたいのですが、どうすればいいのですか?
eval
713 :
デフォルトの名無しさん :2006/07/09(日) 07:55:16
>>712 具体的にIF文の条件として使うときはどうすればいいんですか(´・ω・`)?
my @list = ('$a > 5', '$b =~ /a/', '$c <= 300'); if (eval($list[0])) { } if (eval($list[1])) { } でも絶対、考え方が間違ってる。普通はこんな事必要ない。 あと、頼むから例だとしても $a と $b は使わないで・・・。
715 :
デフォルトの名無しさん :2006/07/09(日) 08:30:44
>>714 レスありがとうございますm(_ _m)
>$a と $b は使わないで・・・。
すいません・・。
> my @list = ('$a > 5', '$b =~ /a/', '$c <= 300');
>if (eval($list[0])) { }
>if (eval($list[1])) { }
>普通はこんな事必要ない。
まじっすか。IF文に色んな条件を使いたいときはどうすればいいんですかね・・?
これ参考にしたんですが、何故かうまくいきません・・。
>>715 > まじっすか。IF文に色んな条件を使いたいときはどうすればいいんですかね・・?
サブルーチンにする
717 :
デフォルトの名無しさん :2006/07/09(日) 08:50:05
>>716 色々ありがとうございます。
ちなみに$a > 5の条件についてはうまくいくんですがパターンマッチの条件$b =~ /a/
はうまく機能してないみたいです・・・。何故だ・・・・orz
あなたが自身のソースをここへ書きだした方が 見ている人もつっこみがしやすいと思うのだが
my @list = ( {'predicate'=>\&is_greater, 'param1st'=>5}, # param1st > param {'predicate'=>\&is_match_substr, 'param1st'=>'a'}, # param =~ /param1st/ {'predicate'=>\&is_less_equal, 'param1st'=>300} ); # param1st <= param my $n = 10; my $s1 = 'cat'; my $s2 = 'dog'; if(evaluate($list[0], $n)){ print "TRUE\n";}else{print "FALSE\n";} if(evaluate($list[2], $n)){ print "TRUE\n";}else{print "FALSE\n";} if(evaluate($list[1], $s1)){ print "TRUE\n";}else{print "FALSE\n";} if(evaluate($list[1], $s2)){ print "TRUE\n";}else{print "FALSE\n";} exit; sub evaluate{$_[0]->{predicate}($_[0]->{param1st}, $_[1])} sub is_less{$_[0] < $_[1]} sub is_less_equal{$_[0] <= $_[1]} sub is_greater{$_[0] > $_[1]} sub is_greater_equal{$_[0] >= $_[1]} sub is_match_substr{ my ($pattern, $str) = @_; return 1 if $str =~ /$pattern/; }
汚いソースだな。。。 CPANにあるValidator系のモジュールのソースを利用するんじゃだめなの?
lisp,scheme向けなんじゃないかと
722 :
719 :2006/07/09(日) 09:47:17
訂正。 sub is_match_substr{ my ($pattern, $str) = @_; $str =~ /$pattern/; } こうだな。
723 :
719 :2006/07/09(日) 09:47:53
ちなみに719は、質問者じゃないっす。
>>711 条件文を配列にしなければ上手く行かない仕事というのが
全く思いつかないんだけど?(コンパイラでも作ってるんで無いかぎり・・・
if(evaluate($list[0], $n)){ print "TRUE\n";}else{print "FALSE\n";} if(evaluate($list[2], $n)){ print "TRUE\n";}else{print "FALSE\n";} if(evaluate($list[1], $s1)){ print "TRUE\n";}else{print "FALSE\n";} if(evaluate($list[1], $s2)){ print "TRUE\n";}else{print "FALSE\n";} こんなになってる段階で配列にした意味などないわけだが、 どうしてもやるならサブルーチンリファレンスの配列にする方が いくない?
726 :
719 :2006/07/09(日) 10:37:22
それは動作確認用のテストコード。 なんで配列にするかは知らない。質問者に聞いて。
条件文が100万くらいあるんじゃね?
考えられる可能性 1)条件文が100万入ってる内容のファイルを受け取って、それを処理しなければならない 2)自動的に条件文が生成されるスクリプトを作った 3)単にそういう風に書いて見たい気がした 3)だったら、考え直す事をおすすめする
sub evaluate { my $list = shift; my %_eval; while( my( $key, $value ) = each %$list ){ $_eval{$key} = 1 if $value->(@_); } return %_eval; } my $list = [ a => sub{ $_[0] > 5 }, b => sub{ $_[1] =~ /$_[0]/ }, c => sub{ $_[2] <= 300 }, ]; evaluate( $list, $_a, $_b, $_c ); は?
729です。
sub evaluate {
my %list = @_;
my %_eval;
while( my( $key, $value ) = each %$list ){
$value->{sub}->() if $value->{eval}(@_);
}
}
evaluate(
a => { 'eval' => sub{ $_[0] > 5 }, 'sub' => sub{ ... } },
b => { 'eval' => sub{ $_[1] =~ /$_[0]/ }, 'sub' => sub{ ... } },
c => { 'eval' => sub{ $_[2] <= 300 }, 'sub' => sub{ ... } },
);
かな?
出来なくはないが
>>728 に同意
は?
sub evaluate { my %list = @_; while( my( $key, $value ) = each %list ){ $value->{sub}->() if $value->{eval}(@_); } } だな。
732 :
デフォルトの名無しさん :2006/07/09(日) 21:38:10
質問です 1,山田,20,男 2,田中,23,女 ... という様なテキストファイルを読み込んで, %id1 ( id=>1, name => "山田", age =>20, sex => "男", ); %id2 ( id=>2, name => "田中", age =>23, sex => "女", ); となる様な%id?というハッシュ変数に代入したいのですが, @list_oneline =("1,山田,20,男", "2,田中,23,女"...); とした後どうしたら良いかわかりません. なにかヒントをいただけないでしょうか?
946 名無しさん@お腹いっぱい。 [sage] 2006/07/09(日) 21:07:41 ID:+71JwTPW ハ,,ハ ('(゚∀゚∩_ おいらをどこかのスレに送って! /ヽ 〈/\ お別れの時にはお土産を持たせてね! /| ̄ ̄ ̄|.\/ | .モツ煮..|/  ̄ ̄ ̄ 現在の所持品:たばこ他48品圧縮.zip・どようび・ドエット 糞スレ・rigel・ギコペ・Jane・ニンバス2000 ・霊的な力 greensleeves
>>732 %id1, %id2, ... というハッシュに代入するのは、うまいやり方とは言えません。
以下のように、ハッシュの配列を用意した方が処理が簡単だと思います。
@id = (
{
id => 1,
name => "山田",
age => 20,
sex => "男",
},
{
id => 2,
name => "田中",
age => 23,
sex => "女",
},
...
);
それぞれは、$id[0], $id[1] などで取り出せます。
データ内のidの値と配列添字を一致させたいなら、先頭要素を空にして下さい。
>>734 なるほど,ハッシュの配列という操作の仕方があるのですか.
確かにその方がわかりやすくなりますね.
ありがとうございます.早速試してみます.
ハッシュリファレンスの配列だからな。
737 :
デフォルトの名無しさん :2006/07/10(月) 18:27:59
>>691 やはりだめでした・・画像真っ黒のものが出力されました・・
エラーログをおってみようとおもってますが、レンタルサーバゆえすぐ出力されないのか
そもそもエラー判定されてないのかログ拾えてません。
ちなみに最初にのせたロジック単体CGIでテストしてますorz
ulimitでもかけられてるんじゃないの?
739 :
デフォルトの名無しさん :2006/07/10(月) 20:11:05
>>738 レンタルサーバなのですが、それがかかってるのが原因だとしたら
その時点でアウトでしょうか・・
本当にそれが原因なら打つ手なしだねぇ。 共有型のレン鯖では、ulimitかけるのが普通だろうし。 コマンドライン使えるなら、ulimit -a してみたら? 黒画像が出てくるってのは謎だけど。
>>739 20日近く経って未だに何が起きているのか確認できてないなら、
ulimit がかかってなくても打つ手なし。
use Image::Magick;
my @msg;
my $new_image = Image::Magick->new;
push @msg,"$new_image";
push @msg,$new_image->Read("./test.jpg");
my ($width,$height) = $new_image->Get('width','height');
push @msg," <- ($width,$height)";
push @msg,$new_image->Write("jpeg:./test2.jpg");
($width,$height) = (860,int($height * 860 / $width)) if $width>860;
push @msg," -> ($width,$height)";
push @msg,$new_image->Scale(width=>$width,height=>$height);
push @msg,$new_image->Write("jpeg:./test3.jpg");
undef $new_image;
binmode STDOUT;
print "Content-Type: text/plain\r\n\r\n";
print $_,":",$msg[$_],"\n" for ($[..$#msg);
exit;
後、djpeg が使えるかどうか確認してみ。
742 :
デフォルトの名無しさん :2006/07/11(火) 00:25:43
お前ら知ってたかい? RFCでワード検索するときPerl使ってるんだぜ!?
へーぇ!
744 :
デフォルトの名無しさん :2006/07/11(火) 07:54:09
threadを使って負荷計測ツールを作ろうとしています。
ttp://www.drk7.jp/MT/archives/001059.html にあるスクリプトを元に…と思い、
このスクリプトのdoTaskのevalとdieの行をコメントアウトして実行してみたのですが、
なぜか終了してくれません。
topで見てみると33のスレッドが残っていて(最大は103くらいまで増えていました)、
752行出力されたところでとまってしまっているようです。
皆さんの環境でも同じようになるのでしょうか。
こうなる原因も教えてもらえるとうれしいです。
perlを学びつづけることの意義が揺らいでいる 最近やっとCPANのコードを読んだりして勉強するようになったが あまりのコードの可読性の悪さにぷっつんした もはやシンタクスシュガーなんて呼べないような不定形なコードの山 わけのわからないモジュール使って、そのモジュールもわけのわからない モジュールのエンドレス 考えてみたらperl5はもう十年以上も進化止まってるんだよな もうperlのメリットなんてハッシュと正規表現が言語レベルで組み込まれてることだけだよな さりとて今更rubyなんて死んでも言えない
言語の基本部分なんてそう変化しないものだ。そんなことを言ったら CもJavaも進化止まってるよ。 でも10年前に俺が書いてたperlのコードと今のコードじゃぜんぜん違う。 10年前は素朴にベタ書きCGIだったのがいまやCatalyst(+TT+DBIx) だからなぁ。そういう意味では進化しているとも言える。 とはいえ別に強制するようなもんじゃないしrubyがよけりゃrubyでも いいんでねーの?
>>745 そう感じたのなら君にはPerlは合わなかったという事だろう。
合わない言語を無理して学ぶこともあるまいよ。
# 合う人には読みやすいんだよ
Python辺りに行ってみれば?英語圏ではPerlよりも人気だぞ
大量にuseされるモジュールの山は…確かにある程度覚えるまで大変だった記憶があるが…
ああ、strictすら何をするものかわからなくて追っかけたら、
さらにCarpが出てきて厭になったのは懐かしい。
今でこそモジュール名を聞いただけでそれが何かわかるし、
わからずとも調べる術を知っているから苦にもならないがなぁ。
クラスの継承はuse baseと@INC両方可能なんですか?
>>749 @INCじゃなくて@ISAのことだと思うが、どちらでも可能。
ただしuse baseは@ISAの設定以外にもいくつかのことを
やってくれるので詳しくはperldoc base読め。
>>745 本体に取り込まれてるのやよく使われるモジュールでも可読性が悪いのがあるのは確か。
そういったモジュールはbug潰し等の理由がない限りpodを読んで使い方だけを覚えたほうがいい。
コードの勉強が目的ならそういったモジュールではなくコードをきれいに書く作者を見つけてその人のCPANモジュールで勉強したほうがいい。
>考えてみたらperl5はもう十年以上も進化止まってるんだよな
これは単純に勉強不足だな。
英語が苦手だからってドキュメント読んでないのでは?
そろそろ、無名関数では (caller(0))[3] で CV_REF を取り出せるようになっても 良い頃だと思う。
Perl6はいつ出るんでしょうか? ラクダ本はPerl6から3分冊されるかもとラリーが冗談半分に行ってたのですが。
>>753 クリスマス。
ただし何年のかはわからないw
Ruby 2.0と一緒のリリースになったりしてな。
755 :
デフォルトの名無しさん :2006/07/12(水) 02:20:42
合う合わないなんてあるの? 必要だからやるだけだが
>>755 世の中には幸運にも好きな言語だけ勉強すればいい奴もいるわけです。
羨ましいだろ。
cでは char x = 'a'; printf("%02x",x); result:61 だけど perlでは my $x = 'a'; printf("%02x",x); result:00 になるsprintfでも同様です perlではunpackじゃなきゃだめなの?
>>757 unpackしなきゃだめ。
そのsyntaxだと数値として解釈されてるんで、
'a' を数値と解釈しようとして0になっている。
その代わり $x = '123' とかが可能になる。
>>757 ord() ってのもある。
unpack('C', $x) と ord($x) は同じ。
$x が 2 文字以上の場合は先頭の 1 文字に対してだけ処理される。
>>757 > printf("%02x",x);
printf("%02x",ord($x));
762 :
757 :2006/07/12(水) 13:33:47
>>758 perlではfileをopenして読み込むときに
crlfがlfに変換されるというので、それを
確認したかった
printでファイルへ書き戻すと今度はlfが
crlfに戻されるため確認するにはperl中で
するしかないが、単純にprintしても改行
コードが何であるかは確認できないため
dumpしたかった
忌むべき邪悪フレーズ「奥が深い」
>>762 ていうか改行はOSに合わせて変わるんじゃないか?
(Mac だと CR だけになったりしないか?)
で、その辺気にしなくてもいいように binmode や open での layer 指定がある。
>>762 @ascii = unpack('C*', $string);
した方がアレだがまあいい。
>>751 CPANでいいソースみたことない。
非常に興味があるので、きれいに書く作者を一人でもいいのでおすえてほすぃ。
$line = <$fh>; はファイルハンドルから$/の値まで($/の値を含む)を 取り出しますが $/は通常\n(0a)に設定されてますよね? で、この状態でバイナリファイルを読み込んだら当然 バイナリファイル中の0aで区切られますが、そのバイナリ ファイル中の0aの出現頻度はばらばらで、たとえば binmode($fh); @line = <$fh>; としたら@line中の各要素の長さは皆ばらばらになってしまいます かといってslurpしちゃうのはバイナリなんでありえないです ということで、バイナリを読み込むときってsysreadとかreadじゃ なきゃだめなの? なんとか普通の<>の形式でやる方法ってないですか?
769 :
767 :2006/07/12(水) 14:23:28
>>745 あっ、漏れPerlもやってるけどRubyもやってる。
双方にいいものを持ってると思う。
PerlやってればRubyは非常にとっつきやすいので「今更」などといわずやってみては?
Rubyのブロックの考え方を学ぶと、Perlでも他の言語でも応用できるし色々考えが広がるよ。
770 :
767 :2006/07/12(水) 14:33:44
>>768 バイナリの中でありえないと思われる文字列を$/に設定しておけばできることはできる。
$/ = "奥さん!奥さぁん!";
$line = <$fh>;
この場合「奥さん!奥さぁん!」という文字列があるとまあ駄目なのだが。
あと速度面を考えるとsysreadとかreadの方がいいかもしれない。
<>は内部的には「奥さん!奥さぁん!」という文字列を検索する処理が走ると思うので。
むっ?よく考えたら$/にundefを設定すればいいのか?
perlvarよく読め。 $/をundefにするとeofまで読む。 $/に整数のリファレンスを入れるとその整数のサイズまで読む
>>768 > かといってslurpしちゃうのはバイナリなんでありえないです
あり得なくはない。
> ということで、バイナリを読み込むときってsysreadとかreadじゃ
> なきゃだめなの?
長さをそろえたいのなら、むしろsysread/readを使いたがるのではないのか?
773 :
768 :2006/07/12(水) 15:23:47
>>770 ・・・
>>771 $/=\3333;
みたいなのをレコードモードっていうんですね
こんな素敵な使い方があるなんて感動です
さんくす
774 :
767 :2006/07/12(水) 15:57:24
>
>>770 >・・・
ちょwwwなにその冷ややかな態度ww俺カワイソスwww
さぁ!今日から念願のラクダ本を読み始めたぞ! しかしこの本分厚いなぁちっともページが進まん 今日学んだことを忘れないうちに書き記しておこう! 7/12 晴れ ・ラリーは本田アコードに乗っている
776 :
デフォルトの名無しさん :2006/07/12(水) 16:59:32
以前ハッシュ変数の配列を教えて頂いた者です. CGIの一部ですが,Perlの問題だと思うのでここで質問させて下さい. 投稿フォームがあるCGIから送信されたデータをuse CGIで,以下の様に受け取っています. $value_id3 = $form->param('yourid3'); ここで,$value_idnにはyesが入るか空です. しかし,yourid1,yourid2,yourid3...と個数が定まらないし,効率が悪いので, @value_id = ( { ID = 1, value = 'yes', }, { ID = 2, value = '', }, ... ); となる様にwhile文を回そうと思うのですが, while (*1*) { $value_id[$cnt]{ID} = $cnt; $value_id[$cnt]{value} = $form->param('yourid*2*') $cnt++; } *1*と*2*の箇所で悩んでいます. *2*はシングルクオートの中に$cntの様な変数は入れられませんよね? どうするのが賢い方法なのでしょうか.
>>776 根本的に考え方を変えたら?
そもそもparamで 'youridX' みたいにXにIDが入ってるのが間違ってる。
前も変数名にIDが入ってた。
IDをそういう所に入れる考え方を変えないと、いつまでも効率悪い。
@value_id としてるのも、ただのハッシュで(keyがID)
%value_id = (
1 => 'yes',
2 => '',
...
);
みたいな構造にしても良いし、ただの配列で作っても良い。
@value_id = (
'',
'yes', # <-- ID:1
'', # <-- ID:2
...
);
ハッシュの配列教えてもらったからって、全部それで行けという訳じゃない。
778 :
776 :2006/07/12(水) 17:43:59
>>777 はい,たしかに考え方(組み方)が悪いと思います.
もう少しPerlでの処理に向いた方法を考えて組むべきですね.
何をどう変数と置くかなど,もう一度考えてみたいと思います.
ありがとうございます.
>>778 人間にとってはコードを読み解くヒント。
処理系にとってはメモリ領域を特定するための単なる符号。
それが変数名。
通常変数名はハードコードされているので、変数名に基いた処理がある、ということは即ちマジックナンバーをコード中至る所にばらまいていることになっちゃうんですよう。たいへんきもちわるいよう
CamelBones1.0.0記念♪ と宣いつつ、スレッドはないのね、、、
>>778 なんのCGIかは知らんが、yes、no選択のアンケート質問系CGIなら、
'youridX'とかせず、質問の内容をIDにするといいよ。
'ILoveJackson' => 'no'とか。
ループでやりたいなら、1とか3とか数字IDつけるしかないが。
それにしても句読点がプログラマっぽい。
>>781 >それにしても句読点がプログラマっぽい。
阿呆っぽいの間違いだろ?
マジレスすると理系っぽい、だろ?
「教師っぽい」じゃねえの
すみません質問させてください。 public_html以下にディレクトリを作成したいのですが mkdirする場合public_htmlに書き込み権限を与えないとできませんか?
むしろ書き込み権限がないのに書込みできたら あなたはどう思うのか俺は知りたいぞ
>>786 ありがとう。
だとすると、ディレクトリやcgiファイルなどを新たに作ることは不可能?
(権限与えると可能だけどセキュリティ上不可能?)
>>785 それはperl固有の話ではないが、書き込み権限は必要。
それperlに関係する内容ですか?
俺にはOS,システム管理の話にしか思えないのですが
どう関係すると思って書き込んでるのか
頭の悪い俺にもわかるように教えてください。
あとpublic_htmlってとこからperlのスクリプトを
httpdから利用と推察するのだがあなたは
>>1 のテンプレを読んでないのでしょうか?
初心者スレの491だろ。聞いてる内容もいまいち意味不明なところも一緒だ。 あっちで相手にされないからこっちに来たんだろうが、まずまともな質問が できるようになるまで勉強してから出直した方がいいと思われる。
マルチポストかよ
793 :
785 :2006/07/13(木) 13:21:02
>>788-790 ありがとう
>>791 初心者の491って?意味不明
なんかマルチ扱いされて迷惑っぽいので
一応、解決済み(マルチ)ってことで終わります。
図星かよw
マルチ虚言者
もうこないって言うんだから放っておいてやれよ。 それより次の質問マダー( ・▽・)っ/凵⌒☆チンチン
Class::Accessor て面白いな。よーし、パパPerlでOOPしちゃうぞ〜。
>>798 どこがおもしろんだよ?
たんにsetterとgetter作るだけじゃねぇか
保守の観点からしてClass::Accessorはぼつだろ
ねぇ、OOP書けないんだって? ∩___∩ ∩___∩ ねぇ、なんでできないの? ♪ | ノ ⌒ ⌒ヽハッ __ _,, -ー ,, ハッ / ⌒ ⌒ 丶| ♪どうしてどうして? / (●) (●) ハッ (/ "つ`..,: ハッ (●) (●) 丶 ねぇ、どうして? | ( _●_) ミ :/ :::::i:. ミ (_●_ ) | ___ 彡 |∪| ミ :i ─::!,, ミ、 |∪| 、彡____ ヽ___ ヽノ、`\ ヽ.....::::::::: ::::ij(_::● / ヽノ ___/ / /ヽ < r " .r ミノ~. 〉 /\ 丶 / /  ̄ :|::| ::::| :::i ゚。  ̄♪ \ 丶 / / ♪ :|::| ::::| :::|: \ 丶 (_ ⌒丶... :` | ::::| :::|_: /⌒_) | /ヽ }. :.,' ::( :::} } ヘ / し )). ::i `.-‐" J´(( ソ トントン ソ トントン 正直なんで「Rubyでも使ってろ。」なのかわからん。 おまえこそperldoc perlbootを読め
>>799 >保守の観点からしてClass::Accessorはぼつだろ
どう考えても逆だろ???
こっちつかったほうが可読性がいいぞ。
毎回毎回手書きでアクセサーを書いてるの?
んー、Ruby知るとPerlのClass::Accessorはダサいと思ってしまうのは確か。 そういうモジュールがあるだけ便利だけどね。
Class::Accessorを使うと保守性が悪いって話から どう飛躍するとRubyとPerlの比較になってるのだろう。 意味分からん。 Rubyがいいのは分かってるけど それとClass::Accessorは保守性が悪いってのは関係なくね?
>>799 Class::Accessorを使うとなんで保守性が悪くなるのか教えて
Ruby厨が紛れ込んでいる模様。
まぁPerlのOOPがアレなのは今に始まった事じゃないから しょうがないのでは。 オブジェクト作った後で、bless使ってクラス変えられちゃったりとか なかなか面白いけどね。
で、結局Class::Accessorを使ったほうが
保守性が悪いって話は
>>799 の妄言?
Class::Accessorって?最近入った標準モジュール? 俺が持ってるPerl5.003では使えないので却下。
古いバージョンなら使えるぞ
>>812 うわ古!!
まだそんな化石のようなバージョン使ってる奴いるの!?
可哀想に。。。
jcode.plとか使ってがんばっちゃってる状態を想像すると失笑ものだねw
815 :
812 :2006/07/14(金) 00:04:30
>>813 ダウンロードして組み込むのが、ダルイんです…。
>>814 バージョンによって動かなくなるようなPerlスクリプトを書くのは嫌いなのさ。
>>815 が書くスクリプトはバージョン1のperlから動くんですか!?すげーw ぜひそのソースを見てみたい
お前らそんなに煽るなよ; まぁ別にOOPしないんならどんなバージョンでもいいんじゃね? バリバリOOPしたいんなら最新のほうが何かと便利だが
>>815 jcode.pl使っててUTF8とかに変換したいって
要望があったときどうしてるのかが気になる。
KENT?
セキュリティホール開けまくり危険スクリプト配布所に頼るのか
横レス。
>>818 perl 使いにはエンコーディングと無縁な人間も
いることを知っといた方がいい。
データ解析系だと保守契約の絡みもあってそうそう
command の ver. up なんぞやってくれんのよ orz...
ちなみに俺んとこは perl 5.004 @ solaris
KENTはperl4だから論外だろう
無料レンタルサーバーだと、いまだに5.00系のところもあるね。
おまえらそんなに812を苛めるなよ。 812はWindows3.1で動かないWin32アプリを否定して Windows3.1でがんばってるんだから 乙の一言ぐらいねぎらいの言葉投げてやれよ!! でも799=812だとしたら保守性と ポータビリティを勘違いしている痛い奴だな。
825 :
812 :2006/07/14(金) 00:34:45
>>816 ああ、これは書こうと思ったけどだるかった。さすがに4.0以下は考えてないよ…。
でも、5.003もtie関数が一部実装されてないのでさすがに挫折して最近、5.005と5.008入れたんだっけか…。
>>818 ああ、それも書こうと思ったけどだるかった。
jcode.plを使ってUTF-8にしたいってことはCGIだと思うけど、
最近はソースコードをUTF-8にしてるのであんま使ったことないんだよね。
opendirした時くらいか。使ったの。
>>821 ,823
812は「俺が持ってるPerl5.003では使えないので却下」と仰せで
ISPで提供されているのがそうだとか
保守契約先のマシンがそうなってるとかではなく
自分のマシンに自ら進んで5.003を入れている口ぶりです。
827 :
821 :2006/07/14(金) 00:42:30
>>826 そうみたいですね。エンコーディングの方もやってらっしゃる
みたいだし。俺のレスは単なる的外れw
828 :
812 :2006/07/14(金) 00:42:59
>>824 さすがにWinXPだが。799=812じゃないな。
>>826 うーんISPもあるが、以前、自分のマシンで動いて、
会社のsolarisで動かなくて手痛い目にあったので、
古いバージョンでも動かしてみる癖がついたのだが。
>>825 別に文字コードを変換するのはWEB処理に限ったことではないのだが。
で、ソースコードをUTF8で書いているということはすでに5.005以下で動かないわけで
自分が利用しているバージョンとはあわないと812でおっしゃてるのと
とても話が矛盾しまくりんぐなわけでその辺はどうなってるのでしょうか?
ただ煽りたかっただけ?
830 :
799 :2006/07/14(金) 00:47:11
>>807 だから、世の中にはClass::Accessorなんて知らない
奴がたくさんいるってこと
そういう奴がClass::Accessor使ったコードをいじりだし
たらどうなると思う?
perlのOOはただでさえ奇妙なのに、それをさらにモジュール
で隠蔽しようとしたら、もうぐちゃぐちゃだろうが
たんなるset,get関数の定義をしているコードだったら
Javaしか使ってないやつにもすんなり理解できる
CPANのdocumentくらい嫁って思うだろうが
たんにsetter,getter自動で作るだけのモジュールの使い方を
いちいちdocument読んで保守するのは間違いのもとじゃないのか?
ダミアンだってbest practiceで
「可能な限りperl組み込みか標準モジュールで済ませろ!」
て書いてあるじゃないか
単にコード2,3行書く手間を減らすためだけに標準じゃないモジュール
使うんじゃねぇ!ってこと
Class::Accessorが標準モジュールに組み込まれたなら話は変わるけど
今はそうじゃないだろ!
831 :
799 :2006/07/14(金) 00:50:18
それにClass::AccessorはBest Practicesに従うかどうかを いちいち変更可能なんでしょ? 従えばちゃんとgetterとsetterが分離されるけど 何もfollow指定しないで使えば結合されちゃう こんな糞モジュールはつかえんだろうが!
ということは
>>799 は
XMLを処理するのもDBにアクセスするのも
すべて標準モジュールと関数で処理してるんですね!!
すげーーーーーー。
833 :
812 :2006/07/14(金) 00:53:20
>>829 >ソースコードをUTF8で書いているということはすでに5.005以下で動かないわけで
動かない?ああ、まあ文字列処理するのならまともに動かないのでしょうね。
私の場合はPerlをCGIとしてよく利用するけど、UTF-8はERBのようなテンプレートファイル内に
すべて収めて出力するだけにとどめるので、.plの中ではUTF-8の文字列処理は一切しないので
動作しないなどの問題が発生したことはないです。
モジュールやオブジェクトが最も考慮しなきゃいけないのは インタフェースの不変性 だと思ってたんだけど、違うかな? 使う人によってインタフェースが変わっちゃうモジュールなんて ふぁっきんふぉーゆー
835 :
812 :2006/07/14(金) 00:56:50
799はすごいな・・・。とってもすごいな・・・。モチツケと。 同じ時間帯に現れると俺の自作自演とか疑われるじゃねーか。
836 :
799 :2006/07/14(金) 00:57:17
>>832 ちゃんと読めよ
「可能な限り」
って書いてあるだろうが!
>>812 ソースコードをUTF8で書いてるのと
UTF8で書いてあるファイルを開いて処理するのはかなり違いますよ。
「ソースコードをUTF8にしているので」って言われたら普通前者で受け取ると思うよ。
838 :
799 :2006/07/14(金) 01:01:32
なぁぶっちゃけお前らがClass::Accessor使ってる理由なんて 憧れのDan様や宮川さんやなおやが使ってるから、ボクも・・・ ってなとこなんだろ? そういうジャニーズがかっこいいから俺もなんていう くだらない思想をperlの文化に持ち込むんじゃねぇ!
え? Class::Accessor 使わずにいちいちゲッタセッタ作ってるの・・・? なにその給料泥棒
いや 楽だから。
>>836 あなたが拠り所にしている「可能な限り」というのは
結局線引きが不透明ではないですか?
PurePerlでもMySQLやPostgresやOracleへのアクセス可能ですよ?
結局はそういう線引きというのは関わる仕事・組織によって
ポリシーが異なるわけで、そこにあなたがあなたのポリシーで乱暴に
「保守性が悪くなる」とおっしゃるから否定的なレスがついてるのではないですか?
私は5.008以降を使うことが前提とされる組織にいるので
可能な限りソースの可読性を上げることがポリシーとされて積極的に利用しています。
また、利用したことによって第三者に文句を言われたこともありません。
つーか Perl使いなら人の書き方にガタガタ文句つけんじゃねーよ
>>841 同じように、勝手に自分とこの組織の話を持ち出されても困るんだが…。
別に他人のポリシーなんて違ってても構わないだろ。
perl4で書いてるKENTだって居るんだし。ほっとけよ。
>>838 俺は別に子飼氏、宮川氏、伊藤氏になんら憧れなどは持っておりませんが。
ダミアンの名前を出して屁理屈をこねてるあなたのほうがいい加減に失せろ。
845 :
799 :2006/07/14(金) 01:15:33
>>841 だから、モジュールによっては可読性が向上しないってこと
xmlの解析とか、DBのインタフェースを抽象化するモジュールなら
確実に可読性は上がるけれどClass::Accessorがやっている
ことはそういった'ふつう'のモジュールとは違うでしょ
スクリプトのコード自体に変更を加えてるわけじゃん
そういっちゃ特殊なことをやってるのが果たして可読性を上げるの?
俺は初めてClass::Accessor使ってるコードみたとき
何やってんのかさっぱり理解できなかった
ドキュメント読まなくてもすらすら理解できるのが抽象化なんじゃないの?
>>842-843 内容読んでる?スレの流れ読めてる?
799が最初に自分のポリシーを押し付けていちゃもんつけてるんだよ?
人が何していようが関係ないが、
さすがに言われもない内容で自分に因縁つけられれば反撃するでしょ
>>845 > 俺は初めてClass::Accessor使ってるコードみたとき
> 何やってんのかさっぱり理解できなかった
そんなレベルかよ。。。
どうやら799のレベルが低すぎるから、みんなと話が噛み合っていないようです。
初心者なら初心者らしい振る舞いをした方がいいんじゃないかな。
>>845 799はドキュメント読まないでもどんなモジュールでも使いこなすんだ。
へー、へー、へー。エスパーですね。とても真似できません。
ドキュメントも読まないではまったからってファビョってるなんてとても真似したくありません。
/\⌒ヽペタン / /⌒)ノ ペタン ∧_∧ \ (( ∧_∧ おまいら (; ´Д`))' ))(・∀・ ;) おちけつ!!11 / ⌒ノ ( ⌒ヽ⊂⌒ヽ .(O ノ ) ̄ ̄ ̄()__ ) )_)_) (;;;;;;;;;;;;;;;;;;;)(_(
850 :
799 :2006/07/14(金) 01:23:21
>>848 あのね。誰もドキュメント読まずに「使いこなす」なんていってない
「理解する」といっている
>>847 初心者が洋書いちいち買うかよ
>>845 Class::Accessorを使っててどんなコードを書けば
可読性が下がるのかとっても気になるぞ。
アクセサーが増えれば増えるほど比較したときに可読性に差がでるんだぞ。
それを「単にコード2,3行書く手間を減らすためだけに」とは・・・
コードを減らすのと可読性をあげるゴッチャにしてるし、ホントに大丈夫?
>>850 なんで洋書を買えって話になるの?
日本語読めてる?日本語理解できてます?
普通にperldocでドキュメント読めばいいだけジャン?
それと「理解する」能力は有してるんですよね?
理解してるのに使いこなせないんですか?
それって理解してるっていえなくないですか?
ねぇ、マジでさあなたのみんなのレス読み直してみ。
話に論理性がないよ。ハッキリいってキミ頭おかしいよ。
>>850 洋書買っただけで初心者脱出できる思ってるの?哀れだね。。。
夏ってことかねぇ・・・
使いたい人が使えば良いし、可読性が下がると思うなら使わなければ良い。自由。 ただ、他人に自分の意見を押し付けるのは良くない。他人の自由への侵害になるから。 とここまで思って、あれ? これ何かに似てるな と思ったら宗教論争だった。 宗教の自由は憲法で保障されてるわけだし、コーディングスタイルの自由も保障されればいいのにねw
コーディングは書きたいように書けばいいのは同意。
ラリーだったかだれかもそんな感じの格言を残してるし。
ただ
>>799 のような自分のポリシーを押し付けてくる奴が
時々出現してファビョってスレに変な空気を残すからうざい。
巻き添えを喰った812に合掌
Class::Accessor って洋書を熟読しなきゃ理解できないような高等なものじゃないのだが。 そんな「簡単な」モジュールを使うのに、なにを躊躇うのか理解できない。
もういいからこの話題やめようよ
>>799 の
>>847 へのレスで
「なんで初心者がいちいち洋書買うかよ」というレスなのか理解不明。
そもそも洋書を買うより付属のドキュメントを読むのが先だろ。
このへんから799の異常性がかいまみえるな
862 :
799 :2006/07/14(金) 02:20:48
はぁ・・・おまえらこそ大丈夫かよ
>>855 いったい俺のいっていることのどこが宗教だというのだ
>>853 ダミアンの文章は通常のオライリーの他の洋書と比べて読みにくい
これをよみ通せるくらいなら初心者はとっくに脱していると思った
>>850 誰も洋書を買えなんていってないし話に一貫性なんて持たせてない
Class::Accessorのドキュメント読んでみたがやっぱりこれ欠陥品だろ
例えばsetするときに引数の妥当性のチェックができない
通常境界性のチェック等は呼び出す側じゃなくて呼び出される側の担当だろう
いくらperlが型付けされた言語じゃないからってこれは行き過ぎ
とここまで書いてドキュメントでOverriding autogenerated accessorsなんていう
項目が見つかった、あちゃあ
で、この項目読んだが、やはりおれの意見は正しかった
何この引数の妥当性のチェックのトリッキーなやり口は・・・
おいこら
>>851 これのどこが可読性高いんだよ
>>799 洋書の話を脈絡も無く持ち出したのはおまえじゃんw
ニワトリより頭悪いなお前w
>>799 がファビョって「やはりおれの意見は正しかった」と根拠もなく述べていますw
みんながウザイおまえが逃げたと思ってまともなスレに戻そうとしてるのに
戻ってくんなよボケw
>>862 何のためにsetとgetオーバーライドできると思ってんだよ
つーか setter getter毎回定義してぇんならJavaでもやってろよ
>>799-864 「話に一貫性なんて持たせてない 」という書込みでわかるように
799の話には一貫性がなくその場その場を適当に繕って釣りをしているだけです。
もう799にかまうのはやめときましょう
うわぁ、真性だ。
いわゆる [sg]etter が必要な状況ってあんの?
obj->{hoge} っていちいち書かなくていいから楽。
今日ほど会話が成立しない相手が世の中にはいるということを思い知らされたことはない
ジタバタ 〃∩ _, ,_ ジタバタ ⊂⌒( `Д´) <ヤーダーヤーダー `ヽ_つ⊂ノ Class::Accessor::Lvalue ジャナイトヤーダー
そもそも$obj->{hoge}って書いてるとハッシュのキーにstrictのチェックが聞かない。 $obj->hogeとかくとstrictの恩恵にあずかれる。 いちいちオブジェクトのハッシュのキーに生でアクセスしている奴が 引数の妥当性を(ry
>>871 Class::Accessor::Lvalue::Fastじゃないとやーだー
さぁ、盛り上がってまいりました。
一旦CM ,一-、 入り / ̄ l まーす ■■-っ ´∀`/ __/|Y/\. Ё|__ | / |
わらわら
877 :
799 :2006/07/14(金) 08:27:51
すいませんおちが思いつきませんでした
ごめん
>>812
878 :
812 :2006/07/14(金) 09:09:11
>>837 遅レスだけど、たしかに情報が小出しで、色々な解釈できるようなレスだったね。正直すまんかった。
>>877 ちょ、まて、そのネタフリ。なんか俺が全部悪いみたいなオチにしてんじゃねーかw
韓国人が数名騒いでいたようだな。
ちょっと参考になった。
ども、お世話になります。 CPAN経由でモジュールをインストールする時、 初めて perl -MCPAN -e shell を実行すると初期設定が始まりますよね? その後の一連の設定(キャッシュはどこに置くとか、ダウンロードサイトはどこのを使うとか。。) のログというか、設定が記述されているファイルってどこにあるのでしょう? 一応 ~/.cpan 以下とか調べたんですけど、よくわかりませんでした。 おながいします!
Config.pm
cpan> o conf CPAN::Config options from C:/Perl/lib/CPAN/Config.pm:
CGI.pmの本体てどこにあるんでしょうか? lib/CGIの中にはCGI.pmというファイルがありませんでした Apache.pmとかCarp.pmとかがあるけどこれは違うしなぁ
あったバカでした失礼
@{$self->{$param}} これは ハッシュ$selfのキー$paramをデリファレンスして、 それをさらにデリファレンスして配列としてアクセスする で理解はOK?
自己解決したようだが、正常にuseできるんなら%INCみりゃわかるよ。 % perl -e 'use CGI; print $INC{"CGI.pm"},"\n"' /usr/share/perl/5.8/CGI.pm
888 :
885 :2006/07/14(金) 12:36:15
>>887 それ使えますね!めもっときますありがとう!!
>>888 $ perldoc -ml CGI
/usr/lib/perl5/5.8/CGI.pm
>>889 おーそんなのもあったのか。でもマニュアル確認したら
-mはいらんのと違う?
% perldoc -l CGI
/usr/share/perl/5.8/CGI.pm
私もPerl 5.005 Solaris 2.4でやらさせてたけどこの夏ついに RedHat ESにリプレースされる事になった。
>>886 大体あってるけど、ちょっと違う気もする。
$self はハッシュじゃなくてハッシュへのリファレンス。
-> はデリファレンスをしてから添え字アクセスする為の演算子。
まず $self をデリファレンスして得られたハッシュの中からキー $param の要素を取り出してる。
その要素は配列へのリファレンスになっているので、@{ } でデリファレンスしている。
895 :
886 :2006/07/14(金) 16:53:38
>>894 よくわかりました
ありが十匹ありがとう
>>895 ( ´д)ヒソ(´д`)ヒソ(д` )
>>894 ありが十(とう)なら芋虫ゃ二十(はたち)
perlerが210人集まってニート
あれ?ここってperlのスレじゃないの?
ニート雑談スレだけど?
perlってなに?
ティンコに埋める奴じゃね?
903 :
799 :2006/07/15(土) 12:49:06
ごめんなんかスレが殺伐としてきたね お詫びにデザパタでしりとりしようぜ じゃ、おれから Null Object Pattern
漏れのティンコはperl入り おまえのマムコにimport
仕様とおもたらimpo...orz
これはもうだめかもわからんね。
907 :
886 :2006/07/16(日) 09:01:06
おれか?おれがまずったのか? 誠意を素直に表現しただけなのに・・・
908 :
デフォルトの名無しさん :2006/07/16(日) 09:13:33
複素数を使った関数を作っているのですが、どうも上手くいきません。 #!/usr/bin/perl -w use Math::Complex; use strict; my(@mat) = ( 1+i ); func(@mat); sub func { my( @matrix ) = @_; my( @dummy ); print("$mat[0]\n"); $dummy[0] = $matrix[0]; $dummy[0] += 100; print("$mat[0]\n"); } を実行すると、二つの print 文で、同じ値 (1+i)を出力されるべきと 思うのですが、引数の配列がなぜか上書きされて、 1+i 101+i のように出力されます。 どこがおかしいのでしょうか? 複素数を使わない場合は上手くいくのですが… よろしくお願いします。
$matrix[0]に入ってるのは文字列ではなくてオブジェクトです。
なので
$dummy[0] = $matrix[0];
だとリファレンスのコピーになるので$dummy[0]を書き換えると$matrix[0]も書き換わります。
Math::Complexを使ったことないのでざっとしかpodを見てないんですけどコピーするところを
$dummy[0] = Math::Complex->make( Re($matrix[0]), Im($matrix[0]) );
に書き換えると期待されている動きをすると思います。
PS
オブジェクトが文字列に見えるしかけはoverloadプラグマです。
perldoc overload
もしくは
http://search.cpan.org/~nwclark/perl-5.8.8/lib/overload.pm を参考にしてください。
組み込み関数のオーバーライドめんどくせー
911 :
908 :2006/07/16(日) 10:29:33
>>909 どうもありがとうございます。
overload はブラックボックスとしてか使ってこなかったので、リンク先見てみます。
> $dummy[0] = Math::Complex->make( Re($matrix[0]), Im($matrix[0]) );
> に書き換えると期待されている動きをすると思います。
まさにちゃんと動きました。
ただ、type が面倒なので、
$dummy[0] = $matrix[0] + 0.0;
で Math::Complex->make を自動で呼び出し(多分)させることにしました。
どうもありがとうございました。
912 :
デフォルトの名無しさん :2006/07/17(月) 04:57:07
質問、ハッシュのスライスなんですが。 ハッシュスライスを使って、複数要素を一気に設定するには my %hash = (a=>1, b=>2, c=>3, d=>4, e=>5); @hash{'a', 'd', 'e'} = (100,200,300); とできますが、同じことをハッシュリファレンスでやるにはどう記述するんでしょうか? my $hash = {a=>1, b=>2, c=>3, d=>4, e=>5};
@$hash{'a', 'd', 'e'} = (100,200,300);
#!/usr/bin/env perl -w use strict ; my $ref = '' ; no strict 'refs' ; @$ref{'a','d','e'} = ( 10, 20, 30 ) ; print ref $ref , "¥n" ; で暫し悩んだオレ、アホす。寝惚けてるw ( my $ref = undef ; にしたら HASH が返ってきた。) ---- 最初のコードで、 print ref ¥$ref , "¥n" ; したら SCALAR が返ってくる。当たり前。それでいて、 $ref->{a} とかにはきちんと代入されてると。気持わる。 use strict 'refs' した瞬間に怒られてわかったw
そもそもなんでmy $refで$refを初期化しようとしてるの? 変数は宣言時に何も代入しなければundefであることが 保障されてるんじゃないの?
リファレンスで便乗質問 $value = \3; $hash = (a, $value); でこの$valueをデリファレンスしたいんだけど print ${$hash{a}} ; 以外にもっと見やすい方法ないですか?
>>915 たんなる癖です。
my $i = 0 ; # 数字
my $i = '' ; # 文字列
my $i = undef ; # 他
って自分に言い聞かせるために代入してます。
正規表現でマッチチェックするとき、検索文字列にポが含まれていると 検索対象文字列にカタカナが含まれている場合対象文字列の中身にかかわらずマッチしているとみなされてしまいます。 どのようにしたら正しくマッチチェックが出来るのでしょうか? 文字コードをEUCに変えたらうまくいきましたが対象文字列がShiftJISなので変えられません。 具体的には $str='対象文字列タイショウモジレツ'; $serchstr='ポロシャツ'; if($str=~/$serchstr/){ print "match"; }else{ print "nomatch"; } の結果がmatchになってしまうという状況です。
>>916 一番みやすくね?つか他の方法をしらんだけだが。
>>918 use Encode ;
my $str1 = decode 'shiftjis', '対象文字列タイショウモジレツ';
my $str2 = decode 'shiftjis', '対象文字列ポロシャツ';
my $serchstr= decode 'euc-jp', 'ポロシャツ';
if($str1 =~/$serchstr/){ print "match" . "¥n" ; }
else{print "nomatch" . "¥n"; }
if($str2 =~/$serchstr/){ print "match" . "¥n" ; }
else{print "nomatch" . "¥n"; }
$str1 とかを出力したくなったら、
print encode 'shiftjis', $str1 ;
とかしなきゃならなくなるが。
# encode がらみはこのスレでもシタのスレでも話題になってるので
# 検索して参考にすれば?
Perlコーディング初心者質問スレ Part 50
ttp://pc8.2ch.net/test/read.cgi/php/1151250398/
>>920 >my $serchstr= decode 'euc-jp', 'ポロシャツ';
my $serchstr= decode 'shiftjis', 'ポロシャツ';
index使えよ
>>916 > $hash = (a, $value);
が $hash = { 'a', $value }; だとして、
$hash->{a} ではどうでしょう。
924 :
918 :2006/07/17(月) 13:32:37
>>920 ありがとうございます!うまくいきました。
925 :
916 :2006/07/17(月) 13:35:16
あ、間違ってました $hash=('a',value); です
926 :
916 :2006/07/17(月) 13:36:07
がああ頭が壊れてる %hash = ('a', value); ですすみません
>>916 が特に見づらいと感じない俺はPerlに侵されてる?
print ${ $hash{a} }; が一番見やすい。
私はプッシーです
私もプッシーです
Perl Best PracticeとPerl Hacks注文した私もプッシーです
プッシーと言えば冷凍エキスモー
>>929 > (TTよりは文法簡単で、
そうは思えない俺ガイル
あと、独自のescapeを追加したいときとかどうすんの?
>>934 perldocをみるかぎり
=head6 ecp_hoge
[%name="hoge" escape="ecp_hoge"%]
「ecp_hoge」を呼び出す。
(継承先で定義されるていることを想定)
ってあるな。
OutputとかParamとか頭を大文字にしてるのがperlっぽくなくてキモク感じた。
これはどういう意図でやってるの?
>>929 _mk_accessorsもClass::Accessor::Fastでいいような気がした。
>>935 >
>>934 perldocをみるかぎり
> (継承先で定義されるていることを想定)
> ってあるな。
読み落としすまん。そうか、継承するのか・・・。それはちょっとダメじゃねぇ?
> OutputとかParamとか頭を大文字にしてるのがperlっぽくなくてキモク感じた。
同意
> _mk_accessorsもClass::Accessor::Fastでいいような気がした。
同意
Perlで指定する連番アドレスから文字列を 検索・抽出・並び替えて一行ずつリスト化したいのですが可能でしょうか?
「文字列操作か?」? 「可能」: 「時と場合により可能」; 以上
>>934 実はttとかHTML::Templateってそんなに使ったことないので
すごく変なものになってる可能性も高い。
どのへんがおかしいか指摘してもらえると喜びます。
>>935 >OutputとかParamとか頭を大文字にしてるのがperlっぽくなくてキモク感じた。
CGI.pmとかttがそんな感じなのでまねてみたんだけど、やっぱりきもいか。
個人的には小文字の方が好きだけど、
組み込み関数とかぶるのを気にしなくて良いのは利点かな?
>_mk_accessorsもClass::Accessor::Fastでいいような気がした。
その辺は前に組んだスクリプトの流用だったり。
(そのときは仕事だったので、他のmodulesに依存したくなかった)
Class::Accessor::Fastにしようかな。。。
>>936 >継承するのか・・・。それはちょっとダメじゃねぇ?
その辺なんとなく組んだだけなので、ダメかも。
ttもHTML::Templateもよく知らんので、
「この辺きもい」とかの指摘はありがたい。
941 :
935 :2006/07/18(火) 22:54:08
>>940 TTは全部小文字よ。
CGI.pmもcgi-lib.plからの移行の為にVarsを付けてるだけで
他は小文字だと思う(CGI.pmは最近使ってないから自信なし)。
929の「なんとなく」が理由の全てなんだろうけど
HTML::TemplateやTemplateの何が気に入らないとか
アドバンテージを示さないと積極的に乗り換えることはないな・・・
>>940 個人的には、オブジェクトが $my になってるのがダメ…。
エディタによっては不用意に色が変わっちゃうし。
$self か $this かにして欲しい。
あとクラス名の先頭が小文字ってのも…。
943 :
929 :2006/07/19(水) 00:11:07
>>941 >TTは全部小文字よ。
ぉ。そうだったか。どこで見たんだ?>自分
と、言うわけで小文字に変更。
>HTML::TemplateやTemplateの何が気に入らないとか
>アドバンテージを示さないと積極的に乗り換えることはないな・・・
実は、前から似たようなものを自分で自作してて、その後HTML::TemplateやTTを知った。
「なんとなく」公開してみる気になったので、適当に組み替えて公開してみた。
ってのが正直なとこだったり。
(ただ、HTML::Templateは機能少ないと思うし、TTはPerlっぽすぎると思う)
なので、「これが売り」ってのはあんまりないなぁ。。。(コードが短いとか?)
>>942 >個人的には、オブジェクトが $my になってるのがダメ…。
とりあえず$thisにしてみた。($myもkey数少なくて好きだけど)
>あとクラス名の先頭が小文字ってのも…。
とりあえず大文字に変えてみた。(けど、ほんとは名前自体を変えたい)
http://0-9.sakura.ne.jp/perl/modules/SpTemplate.pm いろいろレスくれてありがとう。まわりにPerlの話できる人間おらんので参考になります。
でも、「TTはPurePerlでも動く」とか聞いて、そっちでも良いかもとか思い出したり。
(BSD Licenseにでもして置いとこうかな)
>>943 package名はHTML::SpTemplateのほうがいいんじゃない?
use warningsがないのがキモイ。
use vars qw($VERSION %GLOBAL);よりもour ($VERSION %GLOBAL);のほうが。
ていうか%GLOBALってmy変数じゃダメなの?教えて偉い人。
693行目の2引数のopenキモイ。古いPerlのこと考えたらしょうがないかもしれないけど。
sub Outputが大文字で始まるのキモイ。PODは小文字で書いてあるのに。
sub _warnだけど、dieするんなら$thisを返さなくてもいいんじゃないの? sub sub_dumperもそう。
というか、俺ならこうする(動くか試してないけど)
sub _warn {
my $this = shift;
require Carp;
goto &Carp::croak;
}
たしかモジュールの中でdieすると、「SpTemplateモジュールのn行目でdieしました」ってエラーメッセージのはず。
ユーザ側からすると、自分のプログラムの何行目でエラーになったかのほうが重要だから&Carp::croakのほうがいい。
Carpは標準モジュールだし依存してもいいと思う。
ついでにいうとdieしてるのに_warnっていうメソッド名なのがキモイ。_dieのほうがふさわしい。
Data::Dumperも標準モジュールだから
sub sub_dumper {
my ($this, $param, $attrs) = @_;
require Carp;
require Data::Dumper;
Carp::croak(Data::Dumper::Dumper [$param, $attrs]);
}
って書きたいかも。つーかメソッド名もsub _dumperのほうがいいかな。
あとBSD Licenseよりも、GPL/Artistic Licenseがいいな。
眠いから変なこといってたらごめん。
945 :
デフォルトの名無しさん :2006/07/19(水) 01:43:10
use encoding 'utf8', STDOUT => 'shiftjis', STDIN => 'shiftjis'; use Encode qw(decode encode); とやって、shiftjisのフォームページから文字を以下のように受け取ると if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name,$value) = split(/=/,$pair); $value =~ tr/+/ /; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg; $value = decode('shiftjis', $value); $FORM{"$name"} = $value; } decode処理でエラーがでます…。 decodeしないと、\x{fffd}\x{fffd}\x{fffd}\x{fffd}\x{fffd}\x{fffd} みたいになってしまいます。 「use encoding」で色々調べてみて、utf8フラグが立っていない 文字列をdecodeするべきだと思うのですが、どうすれば良いのでしょうか?
1.encoding を使わない 2.no encoding を使う 3.pack で utf8フラグを取り除く 4.unpack で utf8フラグを取り除く
947 :
945 :2006/07/19(水) 02:20:15
回答ありがとうございます。 私、jcode.plを使っていた時代の人間でして、 最近再びPerlをいじることになり、use encodingで頑張ってる次第です。 ご指摘いただいた内容で調べてみます!
>use vars qw($VERSION %GLOBAL);よりもour ($VERSION %GLOBAL);のほうが。 互換性のためにuse varsの方がいいと思う
>互換性のためにuse varsの方がいいと思う コアモジュールでも結構our使ってるし別にいいんでない?
5.6.1以下を気にするのを互換性と言っておるのか?
フォームに入力したデータを、メールとして送信するCGIを作っているのですが、入力したデータだけ文字化けしてしまいます。 指定した項目に、データが入力されているかを調べるCGIにデータを渡すときに &ReadParse(*input); $howto="$input{'howto'}"; &jcode'convert(*howto,'sjis'); を行い、文字コードの変換をしています。 データをメールで送信する前に &jcode'convert(*howto,'jis','sjis'); でJISに変換し print MAIL"査定方法:$howto\n"; でメール本文に書き込んでいます。 全部で23項目ほどあります。 テストとして「あ」とデータを入力した場合は正常に出力されるのですが、漢字などを混ぜて入力すると 査定方法:出張無料査定 のようになってしまいます。 ソースをシフトJISで書いてもEUCで書いても化けてしまいます。 どうすれば化けずにデータを送信できるのでしょうか?
954 :
935 :2006/07/19(水) 12:07:13
平日の昼12時にアルタ前でオナってくればいい。
955 :
デフォルトの名無しさん :2006/07/19(水) 12:54:21
PerlはC with classes が誕生する何年前に産声をあげましたか?
>>929 やっぱ、テンプレートエンジンって楽しいから自作で作っちゃうよな。
でも、独自の文法とかだと新しいプログラミング言語覚えるみたいでめんどくさい気がするんだが。
MovableTypeのSmartyだっけ?あれも新しいプログラミング言語覚えるみたいで嫌になるけど。
ASPとかJSPとかERBみたいにシンプルなもののほうがいいのでは?
SmartyはPHPでしょ…。 MovableTypeはダイナミック・パブリッシング機能を利用時にPHP+Smartyが必要ってこと。 >ASPとかJSPとかERBみたいにシンプルなもののほうがいいのでは? ASP,JSP,ERBに対する評価は宗教戦争に発展しかねないのでノーコメントとして 俺は各種プログラミング言語ごとにテンプレートエンジンに互換性がないことが不満で、 最近はClearSilverとかに注目中。
$str = 'AxBxC'; @x = split('x', $str); print join('-', @x),"\n"; $str = 'A/B/C'; @x = split('/', $str); print join('-', @x),"\n"; $str = 'A|B|C'; @x = split('|', $str); print join('-', @x),"\n"; 上を実行すると、以下のように3つ目だけ異なる結果になります。 A-B-C A-B-C A-|-B-|-C セパレータが | の時にも上二つと同じ結果が出るようにしたいのですが、 どうしたらいいんでしょうか?
perldoc -f split 汁 第一引数は文字列ではなくてPATTERN @x = split('\\|', $str);
@x = split('\|', $str);
>>958 splitの第一引数は正規表現なので、正規表現のメタ文字はエスケープする必要がある。
また、正規表現を期待されているところに文字列リテラルを書くのは個人的には好きじゃ
ないのでこんなとこ。
@x = split(/\|/, $str);
三人が三人とも書き方が違うのが面白いな
更新すれば良かった
splitでパターンの部分をシングルクォートで囲んでる奴らはキモイ
調べなさ過ぎる奴多すぎるから 次のスレのテンプレでは perldocで最低限調べろとか入れて欲しい
>>964 Perlのsplit(他にあるのかは知らないけど)の仕様自体ちょっと嫌だな・・・
>>965 書いても無駄。
それに本当に鬱陶しいのはそれ以前のレベルの連中だから
・スレ違いの質問はスルーか速やかに誘導すること
の一言を入れて欲しい。
テンプレ読まない連中のための注意書くより、ちゃんと読むであろう真面目な解答者への注意入れたほうが効果的だと思う。
標準外だが知っておくべきな便利なCPANモジュールを教えてください。
969 :
799 :2006/07/19(水) 18:24:21
テンプレートエンジンとかフレームワークの乱立はうざい しかし作る人の技術向上には貢献するだろう したがって作る人にはメリットがあるが使う人にはメリットがない のがテンプレートやフレームワークなのだ なんという矛盾、皮肉 Javaと一緒である。みんなでStruts使ってればいいものを 難しいとかいちゃもんつけてもっとややこしい仕組みを提案して 金儲けをした屑どものなんとうざいことか せっかく自転車に乗れるようになったのに 「省スペースだから」という理由で一輪者を押し付けられるようなものだ テンプレートエンジンの作成は非モテと通ずるものがある 非モテの言論界があんなにかまびすしいのはあれがとても ユーザフレンドリーだからだ 非モテという経験は誰にもあり、何の前提知識もいらずに 皆が飛び込みわいわいできる 難しいこと考えなくてもそれなりに貢献感が持てる テンプレートエンジンの作成はまるで無節操なやりマンのようだ 快楽だけとってあとは医療廃棄物だ まつもとひろゆきさんがいっているようにRailsが優れているのは作者の マーケティングである。それのみである。 WebServiceなんていう創造性のかけらもない領域で生産性なんてうんぬん したってしょうがないのである フレームワークはVSとEclipseとEmacsで十分だ いっておくが俺が一番うざい
そんなお前が好きだ
971 :
956 :2006/07/19(水) 19:26:46
>>957 >SmartyはPHPでしょ…。
スィマッターソーダッター!
>>969 やりマンとやりたいまで読んだ。
そんなお前が好きだ
972 :
デフォルトの名無しさん :2006/07/19(水) 19:41:03
乱立と言えば、CPANも乱立状態が定常化しているね。 パッケージαに自分が欲しい機能がない場合、そのαにその機能を追加することを しない。新たにyaαを作って登録することが定常化している。
>>972 CPAN まで TMTOWTDI だと困るんだけどねぇ…(笑)
モジュールFooがあると、Fast-Fooが登場し、Foo-Liteが登場し、 Tiny-Fooが登場し……
975 :
929 :2006/07/19(水) 23:35:41
>>944 >package名はHTML::SpTemplateのほうがいいんじゃない?
そうするとHTML/SpTemplate.pmって感じで保存することになるのでちょっといや。
(分類としてはまったくその通りだと思うが)
CPANにあげるとかなら変更するかも。
>use warningsがないのがキモイ。
前につけては見たけど、正規表現置き換え周りのwarningが消えなかったので諦めました。(ほんとはつけたい)
>use vars qw($VERSION %GLOBAL);よりもour ($VERSION %GLOBAL);のほうが。
>ていうか%GLOBALってmy変数じゃダメなの?教えて偉い人。
実はこの辺の使い分けがわかってないです。
どう使いわけるん?教えて偉い人。
>693行目の2引数のopenキモイ。古いPerlのこと考えたらしょうがないかもしれないけど。
ごめん。2引数以外のopenがわからん。最近のperlってどう書くの?
>sub Outputが大文字で始まるのキモイ。PODは小文字で書いてあるのに。
直し忘れ。PODが正しいです。
>sub _warnだけど、dieするんなら$thisを返さなくてもいいんじゃないの? sub sub_dumperもそう。
あ〜、サブルーチンは定型で作ってるから考えてなかったな。紛らわしいけど、実害ないのでこれはいいや。
>&Carp::croakのほうがいい。
同意。ただ、できるだけ依存したくないので、Data::Dumperっぽい扱いで修正。
976 :
929 :2006/07/19(水) 23:36:42
>_dieのほうがふさわしい。
そういえば、なんで_warnにしたんだ?>自分
_dieへ変更。
>メソッド名もsub _dumperのほうがいいかな。
「sub_」から始まるメソッドはテンプレート内から呼び出すメソッドなので、頭の「sub_」は削れない。
(これはテンプレート内から「[%dumper/%]」って感じで呼び出す)
>GPL/Artistic Licenseがいいな。
Artistic Licenseはいいけど、GPLは文書添付するのが面倒(単一ファイルが好きなので)
改変BSD License/Artistic Licenseかな。
>>957 >各種プログラミング言語ごとにテンプレートエンジンに互換性がないことが不満
同意。なので、一応これはPerlっぽくなくしたつもり。
(言語仕様も簡単なので、正規表現使える言語なら再実装もそんなに手間じゃないと思う)
>>969 >作る人にはメリットがあるが使う人にはメリットがない
同意。正直使う側のことを考えると公開しないほうが良かったかも。
(まぁ、広めるつもりないので、使う人間なんていないと思うが)
Perl勉強中でとにかくソースが読みたい人にはメリットあるかも。
>>976 957を書いた者だけど、
各種プログラミング言語ごとにテンプレートエンジンに互換がないことと
テンプレートエンジンの文法がPerlっぽくなくすは別問題と思われ
>>975 とりあえず、グローバルに use warnings しておいて、warnings が出る
箇所だけ、スコープローカルに no するのがいいんでないかい。
コメントあれば尚良し。
use vars と our は大体同じ役割だけど、our は確か 5.6.0 以降に追加された。
それより前のバージョンでも動作するスクリプトやライブラリなら、
use vars にするのが良いだろう。
%GLOBAL はパッケージ外から参照する必要がなければ my で良し。
個人的な希望を言うと、[% %] は変更できた方がいいかな。
細かいこと言うと、sub_ とかするぐらいなら、別の名前空間にブチ込んだ方が
いいかなぁとか、色々あるけど、好みの問題だし。
# Carp::croak() って、メッセージの最後に . が付かないんだよね。
# とても細かいんだけど、それが気に入らない。
# user@localhost:~$ perl -MCarp=croak -e 'croak("Died")'
# Died at -e line 1
# user@localhost:~$ perl -e 'die()'
# Died at -e line 1.
979 :
956 :2006/07/20(木) 00:45:44
>>976-977 他言語と互換を保つってきつくないか?
テーブルタグのような表出力の場合、イテレータやレコードセットオブジェクトみたいなデータ集合も、
テンプレートルールとして考えておかなくてはならんような希ガス。とか。その他、色々めんどくさす。
他言語に入れ替えられるっていってもそんなに用途なさそうだし。
いや、プログラミング手法が統一できるって意味では有用なのか。
>>979 957にわざわざClearSilverの名前が出てるんだからとりあえず見てから書けば?
>975 open (IN, '< '.$path) or die 'file open error'; # 2引数のopen open IN, '<', $path or die 'file open error'; # 3引数のopen
ExtUtils::MakeMakerで生成したMakefileでmake testすると -wで実行されてウザイのですが、-wつかないようにする にはMakefile.PLにはどう記述すればいいかわからず困って います。Test::Harnessがつけてるらしく $Test::Harness::switches をいじればいいっぽいのですが、どう書いていいやら。 自作の部分ははじめからuse warningで書いているので 余計な警告が使用している外部モジュールの中で出るだけ なので-wはあまりうれしくありません。
>>976 すまん。ちょっと使い心地をみようかと思ったんだけど podの通りに
use SpTemplate;
my $tmpl = SpTemplate->new(
'param' => { 'test' => 'hoge' },
'file_path' => './test.tmpl'
);
print $tmpl->output();
と書いたがエラーで動かない…。
file open error at SpTemplate.pm line 693.
file_path をいろいろ変えてみたが一緒。
とりあえず、オブジェクトの中身を見てみたら、
file_path => param
になっていて、'./test.tmpl' 自体は key として登録されてた。
984 :
デフォルトの名無しさん :2006/07/20(木) 20:02:31
一般ユーザー権限でperlから、 あるファイル(※権限777,ディレクトリも777)に対して renameを実行したら、権限エラーになってしまいましたが、 unlinkは成功しました リネームと削除は同等の権限がないと出来ないと思っていたのですが 違うのでしょうか?すみませんが詳しい方理屈を教えてください。
>>994 renameはrename先についての権限も関係する。
986 :
929 :2006/07/20(木) 23:21:03
>>977 >各種プログラミング言語ごとにテンプレートエンジンに互換がないことと
>テンプレートエンジンの文法がPerlっぽくなくすは別問題と思われ
そりゃそうだけど、Perlっぽい文法なら他言語じゃ使わんでしょ。
(記述言語っぽいやつって記述言語に依存してること多いし)
>>978 >とりあえず、グローバルに use warnings しておいて、warnings が出る
>箇所だけ、スコープローカルに no するのがいいんでないかい。
そやね。そうしようかな。
>%GLOBAL はパッケージ外から参照する必要がなければ my で良し。
一応%GLOBALは外部から参照されることを考えてる。
たとえば、スクリプトの先頭で「SpTemplate::GLOBAL{'default_escape'} = 'html'」とか書いとけば、
それ以後生成されるオブジェクトに継承される。
>個人的な希望を言うと、[% %] は変更できた方がいいかな。
これは考えたけど、「sub_if」内で「 [ ] 」とか使ってるから「[% %]」だけ変更できても意味ないかなと思ってやめた。
(「sub_if」内の変数まで全体で管理したくないし)
>細かいこと言うと、sub_ とかするぐらいなら、別の名前空間にブチ込んだ方が
>いいかなぁとか、色々あるけど、好みの問題だし。
ほんとは「_conv」内で解析した後、別オブジェクトを作って投げる感じにしたかったんだけど、
結構全体で管理する変数もあるし、何回も呼ぶから遅くなるような気がしてやめた。
(全体的にもうちょっとオブジェクト指向っぽくしたいけど、うまいやり方が思いつかんかった)
987 :
929 :2006/07/20(木) 23:23:02
>>979 >他言語と互換を保つってきつくないか?
とりあえず、Ruby、PHPなら同じようなもの組めるかなとか考えて作ってます。
hashとarrayと正規表現使える言語なら、同じ仕様のテンプレートを解析するライブラリ組むのは難しくないと思う。
(互換性ってその程度のことよ)
>他言語に入れ替えられるっていってもそんなに用途なさそうだし。
まぁ、テンプレート共通で言語を変えるってほとんどないだろうから、あんまり意味ないとは思うけど。
>>981 >open IN, '<', $path or die 'file open error'; # 3引数のopen
あ〜、そういえばそんな書式も見たことある気がする。こっちのほうが良いなぁ。
>>983 ごめん。思いっきりバグってた。とりあえずPODの通りくらいには動くようにしてみました(まだバグあると思うけど)
>>986 >たとえば、スクリプトの先頭で「SpTemplate::GLOBAL{'default_escape'} = 'html'」とか書いとけば、
それキモイ。OOスタイルな意味ないじゃん。クラスメソッドで
SpTemplate->default_escape('html');
みたいな呼び出し方を考えるべき。
>>929 ループのデータセットは、配列参照かハッシュ参照なのか。
DBからのレコードセットとかの場合どう対処するの?
全部、メモリにロードしてから出力?メモリ食いそうだな。
まあ、どんなテンプレートエンジン作る際でも問題となってくる部分ではあるんだが。
誰も次スレ立てないのかよつд`)
もう自棄だ。建てて来る
>>967 を1の3段落目の最後にこんな感じで混ぜておくか。
| スレ違いの質問にはスルーか、速やかな誘導をお願いします。
異議があったら準備中に宜しく
埋め
>>991 乙
$self->kakikomi("埋め") while $self->count() < 1000;
$self->kakikomi('埋め') for 994 .. 1000;
うめ
$self->kakikomi("埋め");
ume
998
999
セン
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。