1 :
Mr. Moonlight ◆r0zx1vMqaw :
03/03/25 00:23 "The duct tape of the Internet"こと、
Perlについての質問箱です
"There's more than one way to do it"ということで
Perlの奥深さについて皆で語り合い、追求してまいりましょう。
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板
http://pc2.2ch.net/php/ )
CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったり
するのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
2げと
4 :
nobodyさん :03/03/25 02:05
6 :
デフォルトの名無しさん :03/03/25 16:04
7 :
デフォルトの名無しさん :03/03/25 16:07
8 :
デフォルトの名無しさん :03/03/25 17:50
4箱目おめ。 Perlの未来に幸あれ。
>>9 レスありがとうございます。
ダウンロードしてREADMEのとおりに
ppm > install DBD-ODBC.ppd
やってみたんですけどダメでした。
ppdファイルはC:\Perl\binの中に入れたんですけど
場所が違いますか?
11 :
デフォルトの名無しさん :03/03/27 07:18
サブルーチンに配列のコピーを渡す場合は sub(@a) とすればできるんですけど 2次元配列もどき(配列へのリファレンスの配列をコピーして渡したい場合は 逐一自前でコピーするしかないのかな?
>>11 普通に渡していいよ。
@array = ( [0,1,2], [3,4,5] );
&hoge(@array);
sub hoge {
print $_[1][0]; # 結果:3
}
13 :
デフォルトの名無しさん :03/03/27 08:34
>>12 sub hoge {
$_[1][0] = 0;
}
としてしまうと、サブルーチンから抜けたとき、データが破壊されてますよね?
サブルーチン内で変更するけど、抜けたら始めのデータと同じというようにしたいんです。
>>13 一番いいのは変更しないこと。配列のコピーは高くつくよ。
それでもやりたいならStorableモジュール(5.8より標準)を使う。
use Storable qw(dclone);
sub hoge{
my $arg = dclone \@_;
$arg->[1][0] = 0;
}
15 :
デフォルトの名無しさん :03/03/27 15:44
前スレでcpanからのpackage installについて質問した者です。 SolarisでGNUの/usr/local/bin/ldではなくOS付属 /usr/ccs/bin/ldを使ってしまうためld option invalidで 止まるというトラブルは/usr/ccs/bin/ldを一時的に別名にして 回避できました。しかし今度は Term::ReadKeyなどの幾つかのmoduleは今度は別のエラー で止まります.(installできるpackageもある。)曰く、 Running make test PERL_DL_NONLAZY=1 /usr/local/bin/perl "-Iblib/lib" "-Iblib/arch" -w test.pl 1 .. 8 *** Error code 139 make: Fatal error: Command failed for target `test_dynamic' /usr/ccs/bin/make test -- NOT OK Running make install make test had returned bad status, won't install without force どうもtest_dynamicというtargetのtestでかなりのmoduleのinstall がこけます.なにか糸口を思いつく人いますか.
エラーの内容がわからないとなんとも。
17 :
デフォルトの名無しさん :03/03/27 16:41
正規表現スレが、マム板双方で見つけられなかったので、
ここで質問しまつ。
正規表現を使って、次のような文字列から、"
http://hoge.com "
だけを抜き出したいのでつ。
例1: <a href="
http://hoge.com " target="_top">
例2: <a target="_top" href="
http://hoge.com ">
どのような記述になるでしょうか?
"m!<(a|A)\\s*(href|HREF)\\s*=\\s*\"\\s*([^\"]*)\"\\s*!"
っていう書き方では、例2が当然ながらひっかからないわけですが。。。
>>17 /<a\s+href="(.+?)">/i
/<a.+?href="([^"]*)"/i
^^
>>17 正規表現スレは、webprog板にあるよ。
>>18-22 クスコ。
それらを元に、この表現で落ち着いたヨカンでつ。
/<(a|A).+?(\s*)?(href|HREF)\s*=\s*"([^"]*)"/i
>23 冗長
>>23 single quote や bare word を考慮しなくてよいのですか。
>>26 W3Cの仕様と違うのでは、、、
(そのように書いてるサイトはありますけど)
29 :
デフォルトの名無しさん :03/03/27 21:30
30 :
デフォルトの名無しさん :03/03/28 04:07
配列を2つ渡すと、一つになっちゃうんですが、なんとかなりませんか? (@a, @b) = &sub(@a, @b); sub a { my (@a, @b) = @_; return @a, @b; } ってすると、@aだけになっちゃうんですけど。 リファレンス使う方法しかないかな?
>>30 > リファレンス使う方法しかないかな?
まあそれがベストだろうね。
>>30 サブルーチンに渡すだけならプロトタイプがある。
受け取る時は使えないが配列の長さが分かるならこんな手がある。
(@a[0 .. 3], @b[0 .. 3]) = &a;
sub join_array { return @_ }
34 :
DQN ◆POoODQNNNQ :03/03/29 00:58
ちょっとここは違うかなぁと思いつつこれ以上の場所が分からないので質問させてくだつぁい。 Namazu の filter の sub filter ($$$$$) は具体的にどの様な処理を行っているんでしょうか? また、この関数に適当な情報を与えてフィルターでこした情報をもらいたい場合、どんな感じ にすればいいんでしょうか・・・・? ちょっと場違いかもしれませんが暇な人教えてくだつぁい!!
その文が perl なら今さっき話題に出てたプロトタイプ、 その変数を呼ぶ時はスカラー変数5つ渡せって意味だな。 あいにくと Namazu の filter 関数の使い方は知らんがな。
36 :
デフォルトの名無しさん :03/03/29 05:58
perl でJAVA の interface みたいなことできますか?
>>36 JAVAが分からんので、どういう動作をするものなのか解説してちょ。
>>36 そもそも厳密な方チェックを行わない言語にinterfaceとか必要ないわけで。
>>36 CPAN にこんなのあるようだが?
MRP::Interface
defines object interfaces
41 :
デフォルトの名無しさん :03/03/29 11:27
パソコンとパールの初心者です MS-dos プロンプトで perl -v と入力しても コマンドまたはファイル名が正しくありません と出てしまいます。 正しくやればperl のバージョンが表示されるはず と本に書いてあるのですが何が間違っているのでしょう?
>>41 > パソコンとパールの初心者です
正直かなりきつくないか?
>>41 まずはお使いのOSの基本機能を極めてみてはどうでしょう?
perlをインストールしてないことに一票だな
>>41 ここではそういうラベルの人はサポート対象外です。
とりあえず "Hello! World" が動くようになってからまた来てください。
perl-v って打ってたら笑うんだけどな。
48 :
デフォルトの名無しさん :03/03/29 18:28
perlで範囲を指定してその中から特定の文字列を抜き出すということは可能でしょうか? たとえば SELECT A FROM テーブル名 WHERE 〜 という文があったときにFROMからWHEREの間のテーブル名だけを 抜き出すときはどのようにするのでしょうか?
>>48 /FROM ([^\s]+) /;
print $1;
>>49 回答ありがとうございます。
しかし処理がよくわからないのですが
FROM以降で空白以外の文字を抜き出しているのでしょうか?
あまりperlに慣れていないものでして申し訳ないです。
51 :
デフォルトの名無しさん :03/03/29 20:02
>>52 >空白以外の文字を抜き出しているのでしょうか
どう考えても彼はそれは理解していると思うが。
すみません、文章が下手であまりよく伝わってないかもしれませんが FROM A,B WHERE C=1 AND D=1 ORDER BY という文があったとしたら FROM と WHERE の間にある文字列(A,B)、及び WHERE と ORDER BY の間にある文字列(C=1 AND D=1) を抽出することができるのかどうかということです。 ちなみにABCDはそれぞれ決まった値ではないです。
>>54 1行じゃ無理でしょ。何らかの解析処理が必要。しかし、SQLパーサを書くのはバカらしい。
って言うかクエリーから情報抜き出さなきゃいけない局面ってどんなのよ?
56 :
デフォルトの名無しさん :03/03/29 23:58
WebProg板にあるのに、なんで重複スレを立てるの?
58 :
デフォルトの名無しさん :03/03/30 00:02
59 :
デフォルトの名無しさん :03/03/30 00:03
>>55 SQLパーサくらいならどこかのマニアが正規表現化してそうだな(藁
>>59 CGIに依存しない…なら、向こうが板違いだろ。初心者スレとは重複してないし。
62 :
デフォルトの名無しさん :03/03/30 00:30
63 :
デフォルトの名無しさん :03/03/30 02:02
>>54 SQLあんまり知らないけど、WHEREとORDER BYは必ずあるの?
あるなら $query=~/FROM\s(.+?)\sWHERE\s(..+?)\sORDER BY/;
で$1と$2に入らないかな?
64 :
デフォルトの名無しさん :03/03/30 02:09
optionalだよ
66 :
デフォルトの名無しさん :03/03/31 20:28
汎用的なスクリプトを書きたいのですけれど、 perlではどのようにplatformの判別をするのでしょうか? もしくは、汎用的に使えるパス区切り文字を持った変数などないのでしょうか?
>>66 >perlではどのようにplatformの判別をするのでしょうか?
LinuxのバイナリはWindowsでは動かんからなぁ。
70 :
デフォルトの名無しさん :03/03/31 22:31
どういうボケなのか全然分からない
>>66 $^OでOSの名前が得られる。
単にファイルパスの処理ならFile::Specモジュールで事足りるよ。
72 :
デフォルトの名無しさん :03/03/31 23:13
>>66 そういうことをやっているモジュールはいろいろあるから、
探してみそ。
>>71 , 72
ありがとうございます。
$path = File::Spec->catfile($a, $b);
で、できました。
それにしてもモジュールの多さにびっくりです。
初めてのPerlしか持ってないのですが、
これはリファレンス系の本が入りますね。
英語が読める人ならいらないんでしょうけど。。汗
>>73 日本語のリファレンスの本買ったってモジュールの話なんか書いてないぞ
(標準モジュールとかメジャーなヤツは別として)
perldoc 読めるようになった方が早い
英語読めなくてもPerlが読めれば意外と何とかなる、がんばれ
英語アレルギーの人って、「何とかなる」人には想像もつかないくらい 凄いですからねー。(その割に日本語プログラミング言語はもの凄い勢いで叩かれたりするんだよな) エラーメッセージとか、ちょっぴりくだけて書いてあるぐらいでもう全然ダメだったりして。 モジュールまわりを懇切丁寧に日本語で書いた本があったら結構売れるかもね。(ないのかな?)
76 :
デフォルトの名無しさん :03/04/01 06:07
Perl/Tkについての質問です。Canvas->postscript() で出力したファイルがghostscriptでよめません...。例えば use Tk; $t=new MainWindow(); $c=$t->Canvas(-width=>600, -height=>480)->pack(); $c->createRectangle(100,200,400,100); $c->update(); $c->postscript(-file=>"result.eps"); MainLoop; を実行するとresult.epsができますが、gvで開くとError: /undefined in AdjustColor云々というエラーが出ます。 なぜでしょうか...。アドビイラストレータでも開けない..
>60 DBI用でないかなー。そういうの。
駱駝本に解説が載ってるモジュールだけでもそれなりの数のような。 特に新版にはたくさん追加されたと聞いたけど、どうなんだろう?
ラクダ本ぐらい入荷しろよ。>近所の書店全部
ソートについて質問します。 クライアント(妻)の要望で数字は全角数字を使っているのですが、ソートすると1,100,2になっちゃうんです。 それを1,2,100にするために、いったん半角に変換してソートし、また全角に戻すってことをやっています。 しかもそれを $data =~ s/0/0/g; $data =~ s/1/1/g; $data =~ s/2/2/g; $data =~ s/3/3/g; $data =~ s/4/4/g; $data =~ s/5/5/g; $data =~ s/6/6/g; $data =~ s/7/7/g; $data =~ s/8/8/g; $data =~ s/9/9/g; なんていう風に。 なんかもっとスマートに出来ませんか?
>>81 全角数字の配列が@dataに格納されてるとして、
%num = ('0' => 0, '1' => 1, '2' => 2, '3' => 3, '4' => 4,
'5' => 5, '6' => 6, '7' => 7, '8' => 8, '9' => 9, );
@data = sort { $temp{$a} <=> $temp{$b} }
map { ($temp{$_} = $_) =~ s/(0|1|2|3|4|5|6|7|8|9)/$num{$1}/g; $_; }
@data;
なんてのはどうです?
>>81 こんな感じかな。けど、比較の度に全角→半角を行うから多分遅い。
結局、全部半角に変換して比較して元に戻す方がよさそう。
@a = qw(1 200 3 123);
print join " ", sort num @a;
sub num {
@N=qw(0 1 2 3 4 5 6 7 8 9);
($A,$B)=($a,$b);
for($i=0;$i<10;++$i){
$A=~s/$N[$i]/$i/g;
$B=~s/$N[$i]/$i/g;
}
return $A<=>$B;
}
>>82 うあ。私のよりずっといいや。逃げよ、、、
>>82 出来ました!
おかげさまでスクリプトがすっきりしました!
どうもありがとうございました。
>>83 またよろしくお願いします。
>>81 全角数字は、逆立ちしても文字列でしかないのでは? とりあえず素のperlでは。
内部的には数字であつかって、表示の際に変換するようにできるような
システムではないのかな?
ちなみに、Jcode.pmのtrとかいうのも使えるよ。
>>86 「文字列」の定義からだな。
EUCなシステムでのSJISはただバイトストリームでしかないわけで。
>>81 @datas = sort { ('0' x ((30 - length $a) / 2). $a) cmp ('0' x ((30 - length $b) / 2). $b) } @datas;
…ごめん、一行でやってみたかっただけ。
比較の度に文字列操作するから、データ量が多いとめちゃくちゃ遅いはず。
あ〜。 dataって、もともと複数形だった…
90 :
デフォルトの名無しさん :03/04/01 23:13
質問です。 例えば system ('ftp hogehoge.com'); みたいなことをして この後ftpコマンドに対する入力はどうすれば出来るのでしょうか? よろしくお願いします。
>>90 うまくいけば標準入力が使えるのでファイルをリダイレクトするとかパイプ使うとか。
そもそもそんなことせずにftpなモジュールでも使った方が良いと思うけれど。
あ、 ftpは例えばの話です。 ftpコマンドから帰ってくるメッセージを受け取って 使いたい時などはどうしたらよいのでしょうか?
>>92 つまり、ftpの標準入力に書き込んで標準入力を読み込みたいと?
それは素のperlではデッドロックになりやすいからと意図的に外されていて、
使いたい場合は標準添付の IPC::Open2 か IPC::Open3 を使えとか。
けど、単に ftp を扱いたいだけなら
>>91 に同意。
バッククォート調べて見ました。
メッセージを受けとる方法は理解できたのですが
渡す方法がよく解らなくて困っています。
>>91 さんの方法ってどういうふうに
書けばいいのでしょうか?
>>95 open(FILE,,"| ftp");
IPC::Open* 調べてみたのですが日本語の文献があまり無いようで… バッククォートとパイプでがんばってみます。 ありがとうございました。
人々は無力感を感じた……
99 :
デフォルトの名無しさん :03/04/04 00:35
Windows2000 で ActivePerl を使ってます。 c:\tool\ にある hoge.pl を、perl hoge.pl と ファイル名のみで呼び出すにはどうすればいいですか? たとえばJavaではWindowsの環境変数CLASSPATHにc:\toolを追加すれば そのフォルダ内のclassファイルをファイル名のみで指定できますよね。 これと同じようなことをしたいんです。
C:\> CD C:\tool\ C:\tool> perl hoge.pl
回答ありがとうございます。 どこのディレクトリからでもファイル名のみで 呼び出せる環境を作れると助かるんですが、無理ですか?
102 :
デフォルトの名無しさん :03/04/04 01:00
「perl C:\tool\hoge.pl」の1行を書いた"foo.bat"を "C:\WINDOWS\"に置くとかじゃダメなの?
あ、ファイル名はfoo.batじゃなくて、 "hoge.bat"にすれば > hoge で実行できるけど。
>>101 pathが通った場所にhoge.plを置けば
C:\>hoge.pl
で呼び出せない?
ちなみに、環境変数CLASSPATH って、Javaでは関係あるけど、Perlには関係ないと思う。
質問です。 Unixのsuコマンドのパス入力などはキーボード叩いた文字が 画面に反映されませんが、あの様な画面に反映しない入力は Perlで実現できないのでしょうか?
109 :
デフォルトの名無しさん :03/04/04 02:00
局所変数に、ハッシュなどのリファレンスの値を入れて、returnで、その局所変数を返すのは間違ってますか?
>>110 そう、それが気になってます。
どんな仕様になってるんですか?
やっぱり、メモリの解放されちゃうんですか?
>>112 え?合ってるの???
たまたま、他に使われてなくて、
アドレス先参照したら値が残ってたって事じゃなくて?
ちゃんと、アドレス先は、保証してくれるの???
>>114 >>115 いいえ、レスありがとうございます。
一応、読ませてもらいますね。
考えてみると・・・
局所変数のアドレスがメモリに残ってたら、
そのサブルーチンを何度も呼び出していると、すごいメモリリークになるのかなぁ〜?
そうすると、やっぱ、メモリ解放されるのが普通なのかな〜と思うのですが・・・
自分でも調べたりしたのですが、あまり詳しく載ってる所がないので困ります・・・。
みんなは、容赦なく局所的に作られたアドレス返してるんですか???
直接Perlを使っているわけではないので、スレ違いかもしれませんが、出来ればよろしくお願いします。 Perl互換の正規表現エンジンをDelphiで使っているのですが HTMLファイルから <H1> ほげほげ </H1> の’ほげほげ’の部分をマッチさせて取り出したいのですが、 <H1>ほげほげ</H1> の場合、 m/<h[1-6]{1}[^>]*>(.+)<\/h[1-6]{1}>/i でいけますが、前者の場合うまくマッチしてくれません。 どのような正規表現であればマッチするのでしょうか?
>>116 あ・・・本当に問題ないんですか?
うん、ありがとうございました。
無駄なポインタを引数に渡すのを止める事にします。
>>118 デフォルトでは改行はマッチングされないよ。
PerlだったらMultiLine指定できるけど、embededは知らない。
\x0d,\x0aを加えてみてはいかが?
>>121 MultiLine指定が使える場合、正規表現は変わるのでしょうか?
122は MultiLine指定が使える場合、どんな正規表現に変えればマッチさせることが出来るのでしょうか? の意味です。 あと追加で > \x0d,\x0aを加えてみてはいかが? は具体的にどうすればいいのでしょう?
$ perl -e '$_="<H1>\nほげほげ\n</H1>"; print m/<h[1-6]{1}[^>]*>((?:.|\x0d|\x0a)+)<\/h[1-6]{1}>/i;' こんなんかな。 まあ、\s使って $ perl -e '$_="<H1>\nほげほげ\n</H1>"; print m/<h[1-6]{1}[^>]*>((?:.|\s)+)<\/h[1-6]{1}>/i;' か(何か汚いな)
あと、単一行として処理するオプションはsだった。 m/<h[1-6]{1}[^>]*>(.+)<\/h[1-6]{1}>/i を m/<h[1-6]{1}[^>]*>(.+)<\/h[1-6]{1}>/is に替えればいいと思う。
う〜ん、mとかsとかつけてみましたが変化無しでした。 結局、124氏の表現でうまくいきました。 うまくいったんですが、気になるのでついでに聞きます。 124氏の表現中の’?:.’はどういう意味があるんでしょう? Perlは未だ触ったことがないので・・・。 でも、正規表現を扱ってみてPerlってテキスト処理にぴったりだと納得しました。 こんど暇を見つけて色々遊んでみようかと思います。
( ) … $1,$2,...で参照できるカッコ (?: ) … 参照しないカッコ
まあ向こうはネタスレだろ。こっちの方が数倍まとも。ホットケ
130 :
デフォルトの名無しさん :03/04/04 10:52
検索エンジンの検索式を解析するモジュールってありますか?
132 :
デフォルトの名無しさん :03/04/04 11:24
例外処理はevalで実現するんですか?
evalは最後の武器でつ
最終兵器エバル
135 :
デフォルトの名無しさん :03/04/04 12:18
>>99 環境変数pathにActivePerlのperl.exeの場所を記述する。
私は、d:\perl\bin\perl.exeという構成なので
PATH=d:\perl\bin;〜省略
としている。
ちなみにxp環境ではperl hoge.pl ではなく、hoge.pl だけで実行できるんですけど
これはなぜなんですかね。
よくわからない。
>>127 あぁ、そういうことなんですね。
皆さん親切にありがとうございました。
おまいら怠惰だな。
>>135 Windowsの関連付けに従っているだけです。
私の場合*.plはエディタに関連付けてるので、同じ事をするとエディタが起動します。
140 :
デフォルトの名無しさん :03/04/04 14:13
>>126 これはどうよ。
undef $/;
while(<>) {
s/\r\n?//g;
while (s|<H1>(.+?)</H1>||i) {
print $1, "\n";
}
}
141 :
デフォルトの名無しさん :03/04/04 18:24
文字列を先頭から調べて指定した文字列にマッチしたら イベントが発生するようにしたいんですけど、 どうすればいいですか?
指定した文字列にマッチするかどうかだけでいいの?
>>141 イベント?
こんなのでなくて?
foreach $b ($a =~ /(.)/g) {
# 何か実行
}
ループで文字列$strを先頭から調べて、 ある正規表現にマッチしたら何かを処理。 文字列を最後まで調べ終わったらループを抜ける ということをやりたいんですけど。 イメージ的には↓こんな感じ while(???) { if($str=~m/AAA/g) { #何か実行 } elsif($str=~m/BBB/g) { #何か実行 } }
while(というかループ)はいらねーんじゃねーの?
例えば $str='AAABBBCCCAAACCCBBBCCCAAA'; のようになっていたときに $strを先頭から調べて ・AAAの文字列にマッチしたらAAA用の処理。 ・BBBの文字列をマッチしたらBBB用の処理。 ・CCCの文字列をマッチしたらCCC用の処理。 を順次実行していく。 文字列を最後まで調べ終わったら終了。 という感じなんですけど。
VBと言うクソ言語は他の言語習得時に何の役にも立たないと言うことが証明されたわけだが。
150 :
デフォルトの名無しさん :03/04/04 19:49
requireやuseでモジュールを読み込んでるのですが、 Can't locate XXXXX in @INC(......) ってなってしまいます。どうやったら@INCの指定するパスを変更できるのでしょうか? もしくは他の解決方法があるのでしょうか? どなたかご教授ください。
>>147 $str='AAABBBCCCAAACCCBBBCCCAAA';
while ($str)
{
if ($str =~ /AAA/)
{
print "$&\n"; # 「$&」はマッチした部分の文字列
$str = $'; # 「$'」はマッチした部分より後ろにある文字列
}
if ($str =~ /BBB/)
{
print "$&\n"; # 「$&」はマッチした部分の文字列
$str = $'; # 「$'」はマッチした部分より後ろにある文字列
}
}
こんなん?
なんか一気に書き込みが増えた(汗
>>147 gc修飾子を使った場合はこうかな?
俺は
>>151 の「$'」使うやつのほうが分かりやすい。
$str='AAABBBCCCAAACCCBBBCCCAAA';
while ($str =~ //gc)
{
if ($str =~ /AAA/gc)
{
print "$&\n"; # 「$&」はマッチした部分の文字列
}
if ($str =~ /BBB/gc)
{
print "$&\n"; # 「$&」はマッチした部分の文字列
}
if ($str =~ /CCC/gc)
{
print "$&\n"; # 「$&」はマッチした部分の文字列
}
}
157 :
151,155 :03/04/04 20:25
イベントに固執してる阿呆が一匹いるな。 イベントの意味を理解しているのかねぇ。
それをイベントで処理したいっていうのが
>>141 の主張だろ。
イベントクラスとコールバックルーチン作るんじゃないのか?
>>158 イベントの意味が分からないなら黙ってた方がいいんじゃない?
>>159 クラスを継承してそのとき呼び出されるメソッドをオーバーライドしたりとかな。
ちょっと簡単に書いてみた。
>>158 は黙ってろ。
sub Callback($)
{
print @_,"\n";
}
$str='AAABBBCCCAAACCCBBBCCCAAA';
$func = \&Callback;
while($str=~//gc) {
if ($str=~/AAA/gc) {
&$func($&);
}
if ($str=~/BBB/gc) {
&$func($&);
}
if ($str=~/CCC/gc) {
&$func($&);
}
}
>>163 かちゅでぽっぷうぷした時にきれいだからいいよ。
全角スペースか、
として欲しい。
166 :
デフォルトの名無しさん :03/04/04 21:39
my @a='AAABBBCCCAAACCCBBB'=~/ (?:(AAA)(?{print 'unko', $1, "\n";}))| (?:(BBB)(?{print 'unko', $2, "\n";}))| (?:(CCC)(?{print 'unko', $3, "\n";}))/gx;
釣りか?
レスしてくれた人ありがとうございます。 イメージ的にはHTML_Parserみたいなものを作ろうとしてたんですが、 説明が分かりにくかったですね。 あとは自分でがんばってみます。
sub AAA{print 'unko',$_[0],"\n";} sub BBB{print 'thinpo',$_[0],"\n";} sub CCC{print 'mamuko',$_[0],"\n";} while('AAABBBCCCAAACCCBBB'=~/AAA|BBB|CCC/g){&{$&}($&);}
use strict; sub AAA{print "__CHINPO__$_[0]\n";} sub BBB{print "__MAMUKO__$_[0]\n";} sub CCC{print "__UNKO__$_[0]\n";} my %subs=(AAA=>\&AAA,BBB=>\&BBB,CCC=>\&CCC); while('AAABBBCCCAAACCCBBB'=~/AAA|BBB|CCC/g){&{ $subs{$&}}($&);}
>>168 あ、偶然。
俺もIEやNN用に書かれた汚いHTMLも解析できるパーサを書いたから、
>>147 を見て、「ああ、こりゃ俺と同じでHTML解析したいんだな」って思ったよ。
がんばれ。
それから、俺は正直、IEやNNが処理するユルユルHTMLの完全な仕様が知りたい。
下は俺が調べた結果の一部なんだけど…
●IEやNNは、「< p>」のように「<」の後に空白文字があるとそれをcontentと解釈する。
●IEやNNは、「<p>if (i<10)</p>」や「<p>if (j<-10)</p>」の、「<10」や「<-10」をp要素のcontentと解釈する。
●IEやNNは、「<」の直後が[a-zA-Z/!]ならタグ、それ以外はcontentと解釈する。
●IEやNNは、コメント(こんなの「<!-- -->」)を、SGMLのルール通りには解釈しない。
●「<!-- >」のみだと、これが全てコメントになります。
しかし、「<!-- > -->」だと、「-->」までコメントになります。
しかし、「<!-- > -- >」だと、最初の「<!-- >」までがコメントになります。
まだまだ続く…
こんなことを全部調べた人や、専用のサイトを知ってる人はいますか?
Mozilla だったらソースあるけど、どこから読んだらいいかわからんよなあ。 IE は地道にサンプル html を与えて、結果を解析していくことになるのかな。 パーサを書くんだったら yacc と bison ですか。使ったこと無いけど。
>>170 微妙に書き換えてやれ。
sub AAA{print "__CHINPO__$_[0]\n";}
sub BBB{print "__MAMUKO__$_[0]\n";}
sub CCC{print "__UNKO__$_[0]\n";}
my %subs=(AAA=>\&AAA,BBB=>\&BBB,CCC=>\&CCC);
my $m = join('|', keys %subs);
my $str='AAABBBCCCAAACCCBBB';
&{$subs{$&}}($&) while($str=~/$m/g);
perlの正規表現で 行の先頭にある # を置換したいのだけど、どうすれば良いのでしょうか? $comment =~ s/([#]|^)(# [^<]*)/$1/g; これではダメでした… どなたかお願いします。
たとえば先頭の#を>に置換するなら $comment=~s/^#(.*)/>$1/gm;
178 :
デフォルトで774KB... :03/04/06 15:01
すみません。174とは別人ですが・・・ 応用で、このようにやっても動きませんでしたよ。 $comment =~ s/^#(.*)/$1<font color=\"$refcol\">$2<\/font>/g;
>>178 やってる意味がまったくわかりません
$1とか$2が何かわかってるのか?
>>178 $2 はどこから来るのか考えてみたかい?
>>178 俺は動いたが
$_ = "#hoge";
print $_ . "\n";
s/^#(.*)/$1<font color="#000000">$2<\/font>/g;
print $_ . "\n";
#hoge
hoge<font color="#000000"></font>
ファイルの最後3行を取得したい。 ファイルサイズが大きいので、メモリに全部読み込むことはしたくない。 考えたやり方としてファイルの行数を取得し、 $#@_-3回空回しして、最後の3回だけ値を取得する。 このときの、ファイル行数取得っていい方法ありますかね。
一行ずつ読んで常に三行だけ残すようにしたら?
>>185 @last3 = ();
$i = 0;
while (<>) {
$last3[$i] = $_;
$i = ($i + 1) % 3;
}
push(@last3, splice(@last3, 0, $i)) if $i;
>>187 ありがとうございます
これ使わせてもらいます
tail使え
190 :
デフォルトの名無しさん :03/04/06 19:39
四年ぶりくらいにプログラムやってるんだが、 自分の書いたコードがなんなのか忘れた。 sub Mainloop { /(.+)/; $url = $1; これ、どういう意味ですか? マジでわからない。C言語はなんとか覚えてるけどperlはほんとすぐに忘れる。
sub Mainloop { /(.+)/; $url = $1; ($url eq "") && next; @urlparts = &GetUrlParts($url); #make storing directory name $a_storedir = $storedirT.$storedir; $ldir = ""; for($i = 1; $i <= $dirlinks; $i++) { $ldir = $urlparts[$i].$ldir; } $a_storedir .= $ldir.$storedirE; print "Url=$url\n", "Folder=$a_storedir\\\n", "Date=$date $time\n", "ID=0\n\n"; }
htmlからurlぬきだしてiriaデータ作るスクリプトなんですが。
トレースしろよ
/(.+)/; $url = $1; ↑改行をカットしようとしてるのかな?
195 :
デフォルトの名無しさん :03/04/06 20:19
そうだろうね。 つーか、use strict時には正規表現のコメントを義務化してくれ>らりー
>>194 だと思う。
わざわざ読めないコード書いてPerlのせいにするのイクナイ(・A・)
197 :
デフォルトの名無しさん :03/04/06 20:54
初心者スレから誘導されたっぱいのできました。 マルチポストお許しください。 perlで指定したサーバーが稼動しているか倒れているか調べる関数か何かありますか? 自鯖構築に利用したいのですが、独自ドメインからWebサーバーに飛ばして、 そこで、perlが処理するのですが、 if ($自鯖稼動状態 == 1) { print "Location: $ZISABAurl\n\n"; } else { print "Loaction: $WEBSABAurl\n\n"; } みたいにしたいのですが。
向こうのスレも見てたけど読み辛いよ。
1. サーバって何?Webサーバの稼動確認だけでいいの?
2. どっちのサーバの稼動確認をしたいの?
3. LocationってことはCGIだろうけど
>>1 読んだ?
199 :
デフォルトの名無しさん :03/04/06 21:11
$_ = "ラーメン"; $a = "ー"; /$a/ && do {print "★";}; こういうの書くと Unmatched [ before HERE mark in regex m/ー << HERE / at test.pl line 4. とエラーが出てしまうんですが、日本語に対応してないコンパイラなんでしょうか? OSはwindowsでactivePerlとかいうのをインストールした記憶があります。
/\Q$a\E/ かな。quotemeta参照。
ちょっと調べてもあまりよくわかりませんでしたが、 とにかく、うまくいきました。あり。
何をやりたいかの背景を書いている過程で Locationがでてきてるのであって、perlの話題だからokでしょう。 NET::pingでping打つのはどうかな?
多重投稿防止の仕組み考えていて、クライアントのMACアドレスが 取得できればと思い、いろいろ調べてみたんですが、いい方法が ないんですよねぇ〜、JAVAでもJAVAScriptでもだめ、CやVBなら 出来るようなんですけどVBScriptでは無理っぽいし・・・。 Perlでアクセスしてきたクライアントを一意に特定するいい方法って 何かありませんか・・・?
IPアドレス・・・再ダイアルアップしたら変わるので駄目 クッキー・・・・クッキーを削除されたら無効なので駄目 ということで上記以外の方法で、何かないでしょうか?
>>202 コンピュータは稼働中でも、ウェブサーバが生きているとはかぎらない。
LWPで自鯖にアクセスすればよかろうもん
>>203 CやVBでどうやってできるんだ?無理だろ
多重投稿ってIPアドレスかえてまでやらないと思うが。
>>203 送られたデータのCRCでも取得して比較すりゃいいじゃん
>210 CRCだと違う文章を同一文章と間違える確率はどのくらいなんだろ?
>>211 32bit CRCなら、すべての文書のCRCが、均一に分布するとすれば、
異なる2つのもののCRCが一致する確率は、1/2**32ではないか?
心配なら、MD5とかSHA-1とか強力なやつを使えばいい。
213 :
デフォルトの名無しさん :03/04/07 13:08
CGIを一行ずつ実行できるデバッグツールみたいなものないのでしょうか
>>213 何を狙って言ったのか知らないけどperl -d
環境変数を再現したいって意味合いで言ったなら、
スクリプト先頭で予め代入しておくとか。
つーか、CGIの話はWebPr(ry
2chの二重カキコ規制は おなじIPから同じバイト数の時に発生するらしい。 同じことすればいいんじゃないの? 故意に「荒らす」ようなことを防ぐためなら、知らんが。
荒らし対策ならuid/pwd発行して管理すればいいと思うけどなー。
218 :
デフォルトの名無しさん :03/04/07 20:08
引数で与えられたディレクトリ内の全てのファイルに対して ある処理を行いたいのですが、どうやるのでしょうか?
opendir
特に理由がないなら DirHandle 使う方が良いと思う
Inline::CPPってC++コンパイラが必要?
223 :
デフォルトの名無しさん :03/04/08 15:45
perlccで実行ファイルを作りたいのですが、 requireで読み出されているファイルをリンクしてコンパイルするには どうすればよいのでしょうか? どなたかご教授願います。
>>233 requireでできないならpmになおせばいい なおし方は難しくないだろ 勉強で試すぐらいにしかperlccは役にはたたんよ、 実行ファイルはでかいし、まともにコンパイルできない
cygwin で Perl/Tk を動かしたい。 Perl5.6.1対応ならCygwin用のバイナリが転がっているのを見たことがあるが Perl5.8.0 (最近のcygwinはこれを入れてしまう) には対応していなかった。 そこで CPAN からソースを拾ってきて make しようとしたが 途中で windows.h がないといって怒られた。 お前らの中で cygwin にソースからコンパイルしてインスコした香具師はいますか?
Perl5.6.1もcygeinのセットアップで選べば入れられるし Activeperl5.8ではデふぉでtK入ってるし、、、 windows.h は普通 include/w32api/ に入ってるし
Perl5.6.1とPerl5.8.0 のXSには互換性がない対応してないのはあたりまえ
228 :
デフォルトの名無しさん :03/04/08 22:17
サーバープログラム組むならNet::Daemonがいいですか?
Doraemon
モジュールなんか使うな
231 :
デフォルトの名無しさん :03/04/08 23:05
Perlで、ハンドルをファイルを介さないで文字列に繋ぎたいんだけど、 無理でつか?
232 :
デフォルトの名無しさん :03/04/08 23:06
25歳。
去年まで金無し君だったけど、オンラインカジノとパチンコで
二年で350万貯めた。一度やってみなよ。
初回のみだけど、1ドル以上のチップを買えば30ドル(4000円くらい)貰える。
もらうだけもらってプレイせずに換金することもできるし、ルーレットで赤か黒に
思い切って賭けてしまえば50パーセントで二倍になる。
金なきゃオフラインでゲームすればいいだけ。暇つぶしになる。
ビデオポーカーとかスロとか色々あるのでマジでお勧め。
http://www.imperialcasino.com/~1kl5/japanese/
233 :
デフォルトの名無しさん :03/04/08 23:21
>>231 いまいち意味がわからないけど
STDINとかを使いたいってこと?
>>231 C++でいうところのstd::stringstreamということかな?
Perl5.8.0以上ならPerlIO::scalarが、古いバージョンならIO::Scalarが使えるよ。
全部 perlで代用できるんで 最近ワンライナー以外では awkとか使わなくなっちゃったな。
237 :
デフォルトの名無しさん :03/04/09 00:41
XML::RSS ってどっか置いてない?
238 :
デフォルトの名無しさん :03/04/09 00:59
>>233 >>235 ありがとう参考なりますた。
use IO::Scalar;
my $s;
tie *STDOUT , 'IO::Scalar', \$s;
print "OK\n" ;
print STDERR "### $s" ;
untie *STDOUT ;
結果
### OK
こんな感じでSTDOUT奪えました。
ただ、IO::Scalarって標準モジュールじゃないんすね、
クライアント先で動くかが、不安なところ・・・
でも助かりました、感謝!
237 デフォルトの名無しさん 03/04/09 00:59
大根
ってどっか置いてない?
239 デフォルトの名無しさん 03/04/09 00:59
>>237 八百屋いけよ(w
時間間違えた(鬱氏
>>239 勝手にModuleインスコすることが、まかりならぬ場合もあるのよね・・・。
国から金出してもらってる団体のサーバとか、こういう構成で使う
って提出しているので、それ以外に使うと国に金返せっていわれる。
そのせいで、sh 以外の入っていないUNIX触ったこともあるです。
馬鹿な話だとは思うけど。
237 の質問とその話がどう結びつくわけ?
べつにぃ。 関係ない話だもん。
, '"  ̄ ヽ
ル)"ノノルλ . .
ルil ゚∀゚ノリ ミ.:;∧∧
#####++⊂⊂[| ) ∵'( ゚д゚)
>>244 ゞ ミ /_ 〉〈 ゝ 彡 /U /つ
し'ノ ( ノ ノ
いやCPANにないのよXML::RSS
お前は本当に検索したのかと問い詰めたい
お世話になってまつ。 さっきの質問に関連するんですが、 多重にtieした場合、untieで復元出来ずに困ってます。 次のコードなんですが、 use IO::Scalar; sub main { my $buf = "" ; tie *STDOUT , 'IO::Scalar', \$buf ; my $buf2 = "" ; tie *STDOUT , 'IO::Scalar', \$buf2 ; print "OK\n" ; untie *STDOUT ; print "1 $buf2" ; untie *STDOUT ; print "2 $buf" ; } main() ; 実行結果は次の様になってしまいます、 1 OK 2 untieできちんと復元できれば、 1 OK 2 1 OK となるはずなんですが・・・ 回避方法ご存知ないでつか?
あぼーん
>>239 rootでない人が勝手に/usr/libにモジュールをインスコしちゃいけないです。
テストしたいから/home/kikyoshaにインスコしたい場合もあります。
Perlクックブックのp424-426には
PERL5LIB環境変数を設定する
-I スイッチを使う
use lib プラグマを使う
といったソリューションが書いてありますた。
>>251 > rootでない人が勝手に/usr/libにモジュールをインスコしちゃいけないです。
勝手にもクソもそもそもできないでしょ。
>>249 それはそういう仕様です。
tie()を複数回行っても、効果は上書きされるだけ。
そういう場合はスタックでも使うんだね。
use IO::Scalar;
my @ios = (\*STDOUT);
my $buf;
my $buf2;
push @ios, IO::Scalar->new(\$buf);
push @ios, IO::Scalar->new(\$buf2);
print {$ios[-1]} "OK\n";
pop @ios;
print {$ios[-1]} "1 $buf2";
pop @ios;
print {$ios[-1]} "2 $buf";
Windowsで使う場合, ActivePerlに比べてcygwin perlの駄目な点ってなに?
プロセス関係が弱そう
>>253 レスどうもです。
参考になりますた。
サンプルで示して頂いたように、
標準出力をtieするのを辞めました。
ありがと御座いました、感謝してます。
257 :
デフォルトの名無しさん :03/04/10 00:02
File::Specについて質問です。html上の相対リンクを絶対リンクに変換する必要があり、 File::Spec->rel2abs()を試してみたのですが perl -e 'use File::Spec; $p="../bin/file"; print File::Spec->rel2abs( $p, "/a/b/c/" ) . "\n";' -> /a/b/c/../bin/file ・・とそのまま連結して返します。 これは仕様でしょうか?解決方法、もしくは別の方法がありましたらご教授下さい。
lib/File/Spec/Unix.pm 見た限りでは処理してないみたいですね。 1 while s![^/]+/\.\./!!; こんなんでどうでしょ。 ちゃんと動くかどうかはわからないですが。
259 :
名無し☆ごんべ :03/04/10 11:07
あかんWinでActivePerl使ってんねんけどちゃんと一個下のフォルダにcgi-bin作って そこにプログラム入れてるけど呼び出せへん。 関連ついてない? だれかおしえれ 意味不明
>259 IISの設定をしていないだけだろ。
cgiは(ry
262 :
名無し☆ごんべ :03/04/10 15:16
ってかIISの設定してるはずやねんけどな〜
>>258 それだとこうなっちゃう。
"../../b" -> "b"
"/a/./../b" -> "/a/b"
"/a/../../../../b" -> "/../b"
こんなとこかねぇ。
1 while s<(^|/)(?!\.\.?)[^/]+/\.\./><\1>g;
>>254 以前cygwinのPerl 5.8を試した時は use encoding 'shift_jis';
しても2バイトめが 5CH のsjis文字列が通らなかった。ActivePerlはOK。
configure か何かまちがってる?
>>263 /../xx や /./ についてはSpecの方で対処してたからいいと思ったケド、
/a/../../b については不備だったかな。
まぁそもそもディレ指定が間違ってるから対処外だと思うんだが。
正規はイマイチ弱いので、参考にさせて頂きます。
266 :
デフォルトの名無しさん :03/04/10 17:51
268 :
nobodyさん :03/04/10 21:13
インスコしたいのはInlineモジュールなんですけど、 もういろいろな書式でインストールを試みたけどできません。 つーか色々な書式があるのは何で??? (サイトによって書式が微妙に違うし。) ppm install Inline ppm install /location d:\Inline Inline ppm install --location d:\Inline Inline ppm install --location=d:\Inline Inline あー
>>269 中見たけどモジュール自体が入ってないみたいですねぃ・・・
271 :
デフォルトの名無しさん :03/04/10 22:47
>>267 見れば分かると思うけど、/.a/../a とかは上手く行かねえから注意しな。
>>272 そっか。
1 while s<(^|/)(?!\.\.?/)[^/]+/\.\./><\1>g;
ActivePerlで入出力のデフォルトを:rawにする方法はありますか? cygwinのなら環境変数PERLIOに設定すればOKでしたが ActivePerlだと↑の方法もopenプラグマでも_でした。
275 :
デフォルトの名無しさん :03/04/11 04:19
1行ずつ標準入力から読み込んで 文字列がマッチしたらhelloと表示するプログラムを作りたいのですが 以下のコードでうまく動きません。 何を入力してもhelloと表示されても良さそうなきがするんだけど何を入力しても helloとは表示されないです。何か間違ってますか? #!/usr/bin/perl $i=0; while ($line=<STDIN>){ chop($line); if ($line=~/.*/) { print hello; }; }
276 :
デフォルトの名無しさん :03/04/11 04:22
あう print "hello"ですた氏にまつ
>>275 何を入力してもhelloと表示されましたが、何か?
うちのlinuxのperl 5.6.1では表示されないっす。 perl -e "print hello"もダメっす そういえば変数には$を付けないとダメだし なんで表示されないんだろ 不思議なこともあるもんだ
perl -e 'print "hello"'は?
>>279 helloって
表示されますね
今度からちゃんと"つけようと思います。
せめてエラーメッセージ位出してくれたらいいのに。。。
バージョンアップしようかな
>>280 なんかうぜぇやつだな。
use strict; つけて perl -cw しろ。
なんでうぜぇかっつーと、 ×せめてエラーメッセージ位出してくれたらいいのに。。。 ○もしエラーメッセージが出せるなら、それを出してくれるようにする方法はありませんか? ちゃんと警告メッセージ出してくれる。 Unquoted string "hello" may clash with future reserved word at hoge.pl line 8. Name "main::hello" used only once: possible typo at hoge.pl line 8.
書き方まずかったかもしれません use strict; は求めていたものです。助かります
>>278 裸のワードは基本的に受け付けないし、変数名には$がいるのがperlってもんだ。
そんな基本的な事も調べずここで不思議がってるとは不思議な奴だ(笑
ちなみに、裸のワードは昔は受け付けていたとかで、
今でも配列のキーとか=>演算子の左とかなら使える。
286 :
名無し☆ごんべ :03/04/11 09:27
Microsoft(R) Windpws 98
(C)Copyright Microsoft Corp 1981-1998.
C:\My Documents\Perl>perl -v
This is perl, v5.8.0 built for MSWin32-x86-multi-thread
(with 1 registered patch, see perl -v for more detail)
Copylight 1987-2002, Larry Wall
Binary build 805 provided by ActiveState Corp.
http://www.ActiveState.com Built 18:08:02 Fed 4 2003
Perl may be copied only under the terms of either the Artistic License of the
GNU General Public License, Which may be found in the Perl 5 source kit.
Complete documentation for Perl,including FAQ lists, should be found on
this System using 'man perl'or'perldoc perl'. If you have access to the
Internet,point your browser at
http://www.perl.com/ , the Perl Home Page.
>>285 今更遅いが
意図したことと違うことを書いてしまいますたスマソ
$を付けるのは知ってます。
不思議と思ったのは
実行自体は通るけど何も表示されない。
空っぽの変数みたいだけど
perl -e '$hello = 5 ; print hello;'は実行はされるけども
5とは表示されずになにも表示されないんで
helloは'hello'でも$helloでも無いのにエラーもでないんで
そんときは不思議ですた
>>287 きっとおまいさんは
$hoge = 5; print @hoge;
で5が出なかったら騒ぐんだろうな
何か俺大人気だな(w $hoge と@hogeはさすがに別物だとわかりますけどね 騒いでもいいけど。
print hello,hello; なら hello と出る。
>>290 print STDOUT hello; だった。
printf x,hello; --> x を表示 print q nippon; --> ippo を表示
にゃはは print nippon . ""; nippon
>>271 の言うとおりCPANに置いてあるtar.gzをダウンロードし
自前でインストールすることにしました。
コンパイラは、borlandのbcc32.exe、makeはdmakeをインストールし、
それに合せてConfig.pmを
cc='cl'→ cc='bcc32'
make='nmake'→make='dmake'
のように書き換えました。(いいのかな?)
が、「dmake test」で以下のようなエラーがでました。
「エラー E2075: コマンドライン オプションの間違い : -Gf」
>>295 のエラーは
Config.pmの
ccflags='-nologo -Gf -W3 -MD -Zi -DNDEBUG -O1 -DWIN32 -D_CONSOLE -DNO_STRICT -DHAVE_DES_FCRYPT -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -DPERL_MSVCRT_READFIX'
の部分が引っかかってるみたいなんですが。
これはWin版Perlの設定でデフォルトのコンパイラであるcl.exe用の
コマンドラインオプションだからbcc32.exeではエラーが出るという
ことなんでしょうか?
298 :
デフォルトの名無しさん :03/04/11 16:02
>>296 >これはWin版Perlの設定でデフォルトのコンパイラであるcl.exe用の
>コマンドラインオプションだからbcc32.exeではエラーが出るという
>ことなんでしょうか?
だと思う。
これを回避するには、
1)MSVCを入手する。
2)bcc32+dmakeでperl自体をコンパイルする。
3)perl sourceのwin32/makefile.mkを見てccflagsをCFLAGSに合わせる。
という方法ががある。3)はうまく逝くかどうかは保障できないが試して味噌。
299 :
デフォルトの名無しさん :03/04/11 16:37
すんません、ある文字列から頭2バイトだけ取り除いたものが欲しいのですが my $a = 'abcdef';#欲しいのは$a='cdef'。 substr($a, 0, 2); print $a; 結果 'abcdef' となってしまいます… 何か良い方法ありますか?
substrの戻り値を受けろよアホ
>>299 my $a = 'abcdef';
$a = substr($a,2);
print $a;
これで分からなかったら
>>292 行け
すいません、ありがとうございました。
>>302 を見る前に
>>301 の通りに初心者スレに行ったのですが両方に迷惑をかけて
しまったようです。ゴメンナサイ。
>>303 そういう時は、先に「○○へ行きます」と断っておいてから、
○○の方へ書かないとマルチで叩かれるよ。答えてもらえる確率が減るから気をつけた方がいい。
つーか、どうしようもない香具師を向こうに誘導しないでくれ! 板が違うんだから、ここにも初心者スレ作りやがれ! ム板内で完結しやがれってんだ。
WebProg板は初心者用・ム板が中級者以上ということでFA
ここで質問する初心者の大半は CGI関係だからでFA?
>>287 裸のワードはハッシュのキー以外の場合はサブルーチンとみなされる。つまり、
print hello;
は、サブルーチン hello の返り値を print するという意味。
>>301 書くのが遅れましたが適切なスレに誘導して頂き有難うございました。
WindowsとLinuxとで挙動がちがって悩んでます。 Windows: ActivePerl v5.6.0 build 618 と v5.8.0 build 805 Linux: perl v5.6.0 built for i386-linux ActivePerlでは、open()で改行コードがCRLFなファイルと開くと、 $_に入ってきた時点で、CR部分が抜け落ちているような…。 CRLFなファイルだと、改行部分は "0D 0A"と表示されるはずなんですが、 open(IN, $file); while(<IN>){ s/([\x00-\xFF])/sprintf(" %02X", unpack("C",$1))/ge; print $_ . "\n"; } close(IN); ActivePerlでは、"0A"になり、CRが落ちてしまいますが、 Linuxだとちゃんと "0D 0A"になります。 当然の事ながらファイルをバイナリエディタで開くとCRLFな部分は、 "0D 0A"になってます。 回避方法や何が悪いか、わかる方いません?
>>310 元データがLFだけなんじゃないですか?
open(IN, $file);
binmode(IN);
while(<IN>){
s/([\x00-\xFF])/sprintf(" %02X", unpack("C",$1))/ge;
print $_ . "\n";
}
close(IN);
でもやって、データを確認してみれば?
printの第一引数に裸のワードがくると、ファイルハンドルと見なされる。ただし、サブルーチンが事前宣言されている場合はそのサブルーチンが呼び出される。
…これはuse strictの元でもエラーにはならないので注意。
# use warnings FATAL => 'unopened'; で実行時例外を出すことは可能だけど
>>310 binmode()
>>311 , 312
ボケてました。
ご指摘通り binmode()のし忘れでした(恥
ありがとん。
315 :
デフォルトの名無しさん :03/04/12 03:22
こんばんわ、Perlを勉強しはじめたのですが、理解できない部分 があったので質問させてください。 for($w=0;$w<10;$w++){ $f=&k($w); print"$f\n"; } sub k{ local($d)=@_; my($w); $w=$d*$d; return($w); } というものがあるのですが、2行目の$wには1行目のfor()で決定される数字が 入るのでしょうか?それともreturnでの返り値が入るのでしょうか? もし前者の場合は返り値はどこにはいるのでしょうか?&k($w)自体に入るのでし ょうか? もしも後者の場合は関数kには式だけあって数字がなくなってしまう気がしますが どこから数字をもってきているのでしょうか? かなり初歩的な質問でしょうが、教えていただけると幸いです。 よろしくおねがいします。
すいません初心者スレありましたね・・ そっちにいきます、スレ汚し申し訳ありませんでした。
317 :
デフォルトの名無しさん :03/04/12 12:27
>2行目の$wには1行目のfor()で決定される数字が入るのでしょうか そう >もし前者の場合は返り値はどこにはいるのでしょうか? >&k($w)自体に入るのでしょうか? そう。結果として$fにはいる。
319 :
デフォルトの名無しさん :03/04/12 23:39
プログラム終了時に呼ばれた、オブジェクトのデストラクタの中では、 オブジェクトのプロパティが先に死んでるコトはありえるんでしょうか? 環状リファレンスなども開放されることを考えると、 参照カウント法が機能せずにガベージされると思うんですが、どうでしょう。 また、これを防ぐ方法(END { undef $obj }のような)を モジュール側から行うコトは不可能でしょうか? というか、モジュール側から行えないとしたら、 DESTROYがイマイチ使いにくいと思うので(^^; どなたか、わかる方いらっしゃいましたら、ヨロシクお願い致します。
自己解決したので、県境変数PERLIOの設定値と 実際の\n変換モードの対応をメモしておきます。 (テスト方法: perl -e 'print "\n"'|dump) [ActivePerl v5.8.0 build805] (なし) :crlf :crlf :crlf :unix :crlf :stdio :crlf :perlio 無変換 :crlf :crlf [cygwin v5.8.0-2] (なし) :crlf :unix 無変換 :stdio 無変換 :perlio 無変換 :crlf :crlf …なんかActivePerlってものすごく曲者?
>>274 unix と stdio と perlio は呼びだす(Cの)関数の違いにすぎないはずだから,
それで動作が変わる方がおかしいのでは?
DOS系のプログラムは、\r\nの扱いは使うライブラリや なんかに激しく依存するよ。いろいろ試してみるしかないと 思われ。tellなんかがからむともう悪夢。
325 :
デフォルトの名無しさん :03/04/13 10:42
板違いかもしれないけど、一応Perlの話ってことで・・・ 昨日、Webデザイナーの友達からCGI/Perlの仕事を受けて、 KENTのCGIを改良したものを更に改良するってことだったんだけど、 ま〜ソースの汚さに愕然とした。解析するのに一苦労。 これが「Perl=ソース」が汚いと言われる原因かなーと 今更ながらに思いました。 ヒアドキュメントは便利だけど、HTMLをそのまま埋め込むのはやめれ。 テンプレートを使えよと言いたい。
>>325 その質問にどういう答えを期待しているのでしょうか?
質問は回答者のためにも自分のためにも要点が分かるように書きましょう。
まああくまでソースの話に限定するのなら、板違いでもないのでは。
>>328 愚痴と捉えるならマ板。
CGIにおけるデザインとロジックの分離と捉えるならWebProgか制作板。
もしそうだとしてもPerlが汚いと言われる原因はそれじゃない。
>>330 素人に難しそうと勘違いさせるようなスクリプト組んでる所とかな・・・
Ruby >>>>>>>>>>>>>>> Python >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> forth >>>>>>>>>>>>>>>>>>>>>> awk >>>>>>>>>>>> >>>>>>>>>>> sed >>>>>>>>>>>>>>>>>>>>>>> ed >>>>>>>>>>>>>>>>>> vi >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> perl
>>325 「代表的なCGIのソースが汚いから、Perl=汚いと言われる」と言う事?
どっちにしても、KENTのCGIに文句言いたいならWebProgだろ。
Perlはシェルスクリプト,awkc,,java辺りから構文をかき集めてるような所ががあるから、
汚いソースも書けてしまうのだが、
実力のある人が書くとcやjavaよりも見通しがいいんだよな、これが。
自分だけでスクリプト書くときは Perl的に美しく書く 人に見せるものは、冗長だとしてもきれいに書く while(<>) { chomp; print if (/hoge/) } while ($line = <STDIN>) { chomp $line; if ($line =~ /hoge/ ) { print $line; } } こんな感じ? CとかJavaに無い構文使わなければ、Perl分からない奴に見せても何とかなる <>と<STDIN>じゃ意味違うし、chompもあまり役に立ってないが(w
Perlに慣れてる人だったら上の方が見やすいと思う。 ただ、慣れてない人からは確かに読みにくいかも。 そういう慣用句とかエレガントな表現を学んで行くのも Perlの面白さだと思ってるんだけど、どうかな。
まーそのCGIがあまりにも汚いソースだったので、 Perlのソースが汚いって言われてるのは、KENTに限らず 素人が作ったCGIがネットでばら撒かれてるからかなーと思い、 脊髄反射的に書き込んでしまい、結果スレを汚してしまったのは 正直すまんかった。 KENTのCGIがどうこう言うつもりはないよ。 (KENTのCGIを改良したものなので100%KENTのコードではないし) Perlに関しては知識が浅いし、他の言語も極めるほどやってないので よく分からないのだが、よかったらPerlのコードが汚いと言われる理由を 教えてもらえまいか?
なるべくC言語系の書き方に近づけるために chomp $str; print $str; よりも chomp($str); print($str); という感じで書くようにしてるんですけど 問題ありますかね?
>>337 バグを防止する意味ではむしろ好ましいのでは?
自分は時と場合によって適当に書き分けてるけどね。
(こういう事ができるのがPerlが汚くなりがちな原因の一つ)
>>339 それは思いっきり勘違いだと思うが。
それは正規表現の汚さであってPerlの汚さではないが。
>>340 それも違うだろ。
正規表現も空白やコメントを駆使すればずっと読みやすくなる。
問題はそれをさぼるプログラマが多いと言う事だ。
>>341 >問題はそれをさぼるプログラマが多いと言う事だ。
それがPerlのせい、と?
他の正規表現を扱う言語では汚くならないと?
まぁまて。俺はPerlが汚く書けることは知ってる。 ただそれは正規表現のせいじゃないだろ、と。 Javaで java.util.regex 使ったら汚くなるのか?
>>342 誤解されてるな。
言いたいのはPerlの正規表現は見通しよく書くこともできるし、
そのように書くべきだって事の方だ。
他の言語でも正規表現使えば同じってのは同意だし、
正規表現の代わりにif文の山を作ったらそれこそ見通しが悪い。
言葉足らずでスマンカッタ 正規表現を知らない奴が、正規表現を使って書かれているコードを見たときに 「わけわかんねぇ、*Perlは*汚いな」 と思う事が多いってこと
変数の前に$, %, @が付くのもPerlを知らない人が見たら汚く見える原因だろうね
関数に () が要らないとかもね
すいません、ちとさっぱり分からないことがありまして・・・。 データファイルの管理用に、こうchdirコマンドで ディレクトリを登ったり降りたりしながらファイル情報を集める スクリプトを作ってたんですよ。 今までWin98+Cygwinで使えてたんですが、最近WinXPに変えてですね、 Cygwinのperlもインストールし直したら、chmod("..")が失敗するように なっちまったんですよ。 なんででしょう?代替方法はあるんでしょうか? 「..」を排除するとしたら、フルパスを取る方法が必要ですよね・・・。
それ以前に、変数の使い方がなってないこととかは無いか?(w
超遅レスですが、
>>298 の意見を聞き、色々試行錯誤して
Borland C++ Compiler 5.5とdmakeでActivePerl5.8.0のソースを
コンパイルすることにしました。
http://www.kt.rim.or.jp/~kbk/perl5.doc/perlwin32.html ↑のサイトを参考にwin32/makefile.mkを書き換え
「dmake」すると
エラー E2450 C:\Perl\lib\COREthrdvar.h 85: 未定義の構造体 '_stati64'
エラー E2450 C:\Perl\lib\COREthrdvar.h 86: 未定義の構造体 '_stati64'
というエラーがでます。
対処法分かる方いますか?
>>350 _stati64の定義があるヘッダをインクルードせよ。どこにあるかとか聞くなよ。grep
あるのかな sys/stat.h にstati64ってのならあるけど_stati64はわかんねーや
>>353 all grepしてもなければstati64使ってもいいんじゃない?
>>350 dosish.hの82行目あたり:
#if defined(WIN64) || defined(USE_LARGE_FILES)
このテストが偽になるようにする。
私はとりあえずそれで上手く行っているよ。
USE_LARGE_FILESは#undefしてしまっていいのかもしれないね。
>332 フォーマット文かと思っちまった。
>>348 > データファイルの管理用に、こう*chdirコマンド*で
> Cygwinのperlもインストールし直したら、*chmod("..")が失敗*するように
少しもちつけ
フォーマット文なんてもう2年ぐらい使ってないや。なんでだろ
>>359 テキストでフォーマットすることがなくなtt
フォーマット文なんて今だかつて使ったことないや。なんでだろ
フォーマット文の長所、短所を述べよ。
長所: レコードの繰り返しを吐き出すときは便利 見た目もそこそこフォーマットしてくれる 短所: CSVとかで吐いて別処理した方が良い場合が多い システム管理系スクリプトでリポート吐き出す時とかは便利だよ よく、軽くフォーマットしてメール飛ばしてる
>>362 長所:別途モジュール必要としない
短所:もっと優れたモジュールが沢山ある
>>364 その優れたモジュールを、一言コメント付で紹介せよ。
367 :
デフォルトの名無しさん :03/04/15 22:51
DBD::CSVを使ったシステムを考えているんですけど、 普通にcsvを加工するのに比べてどのくらいパフォーマン落ちますか?
↑パフォーマンスね。(w
369 :
デフォルトの名無しさん :03/04/15 23:14
小さなパーサを作っていて,不等式を解析したい。左辺と右辺はそれぞれ一単語または""にはさまれた一以上の単語というルールがある。 で,具体的には不等式の左辺と右辺を取り出したい。 たとえば, $statement = q["abc de" > 123 or abcde = "zz zz"]; だと,"abc de"とabcdeが左辺,123と"zz zz"が右辺。 これを解析するために $operand = '(?:<=|>=|>|<|=)'; $var = '(?:\w+|"[^"]*")'; $statement =~ s/($var)\s*$operand\s*($var)/(left) $1 (right) $2/g; print $statement; とかすると (left) "abc de" (right) 123 or (left) abcde (right) "zz zz" という出力が得られる。 さて,
370 :
デフォルトの名無しさん :03/04/15 23:14
問題は左右辺を''でくくる場合も許した場合。たとえば, $statement = q["abc de" > 123 or abcde = 'zz zz']; の場合に (left) "abc de" (right) 123 or (left) abcde (right) 'zz zz' としたい。 $operand = '(?:<=|>=|>|<|=)'; $var = q!(?:\w+|("|')[^\1]*\1)!; #ここを変えた $statement = q["abc de" >123 or abcde = 'zz zz']; $statement =~ s/($var)\s*$operand\s*($var)/(left) $1 (right) $2/g; print $statement; だとまったく解析が成功しない。どうして?
>>371 そっちに逝くよりも、まず言語理論の本でも読め。
うーん・・・ ベンチ取るまでもなく体感で分かる遅さ。 (モジュールを使わずにgrepで処理して見た場合と比べて)
374 :
デフォルトの名無しさん :03/04/16 01:05
$a='ab'; $b='abcde'; $b=~ s/$ac/999/o; print $b; 結果 999abcde となるのはなぜ? s/($a)c/999なら999deになるのはわかる。 999が先頭に追加されているということは置換成功しているの? 詳しい人教えてください
>>374 $a='ab';
$ac = '';
$b='abcde';
$b=~ s/$ac/999/o;
print $b;
>>375 thx
未定義の$acにマッチしていたということですね
>>367 =373
そりゃま、DBD::CSVは実務で使う為というよりも、
「他のDBDに簡単に移行できる」というのが売りのプロトタイプ用DBDだからね。
とうぜんパフォーマンスは良くないです。
上手く伝えられるかどうか。。 あるサブルーチン(&HOGE)の中でのみ利用したいサブルーチン(&FUGA)があります。 その$FUGAの中で&HOGEのローカル変数($alpha,$bravo,$charilie,$delta)を使い たいのですが、以下のように記載しても上手く動かないのです。 どなたか解決策を教えて頂けますでしょうか。 # それともこんなことはできない?^^;; sub HOGE { my $alpha = a; my $bravo = b; my $charlie = c; my $delta = d; sub FUGA { "$alpha == $bravo == $charlie == $delta\n" } print ( "content-type: text/plain\n\n" . FUGA() ); exit; }
>>378 構造的にはコレ。
sub HOGE {
my $alpha = a;
my $bravo = b;
my $charlie = c;
my $delta = d;
print (
"content-type: text/plain\n\n" .
&FUGA($alpha,$bravo,$charlie,$delta)
);
exit;
}
sub FUGA {
return("$_[0] == $_[1] == $_[2] == $_[3]\n");
}
>>378 "a"だったとかいうオチは置いといて__
sub HOGE {
local $alpha = "a";
local $bravo = "b";
local $charlie = "c";
local $delta = "d";
print FUGA();
}
sub FUGA {
"$alpha == $bravo == $charlie == $delta\n"
}
こんなんかな。やりたいコトがよくわからんケド。
あぅ、、""で囲み忘れました。゜д゜)鬱死・・・
>>379 今のところそのように書いているのですが、&FUGAと言うサブルーチンは、
&HOGEしか使わないので、&HOGEの中に書いてスッキリさせてしまおうと
思い立ったのが元々なのです。
>>380 ぁぁ、言葉足らずで申し訳ない。
use strict;
されている事が前提なのです。
なのでlocalは私の頭から外れておりました。
と言うことはstrictせずにlocalを使えばできるよ、と言うことなのかな..
なにか方法があるような気もするのでもう少しぐぐってみます。
hoge や fuga の呼び出される回数にもよるけど… use strict; sub hoge { my($al, $br, $ch, $de) = qw(1 4 7 10); my $fuga = sub { $_++ for @_ }; $fuga->($al, $br, $ch, $de); $fuga->($al, $br, $ch, $de); return "al = $al br = $br ch = $ch de = $de\n"; } print hoge();
>>382 なるほど、関数のリファレンスを取ってしまえばいいんですね。
なんとなく理解しました。後は色々と書いてみて慣れます。
ありがとうございました。
>>381 &HOGEの中に&FYGAをかいても外に書こうが中に書こうが、スコープはグローバルだったから無意味だったような気がしますが・・・?
この場合は、無名のサブルーチン定義するのが正攻法なきがする・・・
>>383 =378
わざわざそこまでしてローカルにしなくても、という気がしますが(^^;
「&HOGEからしか使わない」のであって「&HOGEからしか使わせたくない」のでないなら、
普通に書いてしまっても良いのでは?
「スッキリさせてしまおう」という目的なら、余計に読みにくくなる気がします。
>>385 多分そのまま使うんじゃないんじゃないの?
例示したソースをそのまま使うんであれば同意だけど
387 :
デフォルトの名無しさん :03/04/16 21:56
>>377 DBD::CSVのあの異常な遅さってText::CSVを使ってるくらいだから
CSVを厳密に解析してるからだと思うんですけど、
BBSとかApacheのログ程度のCSVに対して使う場合に特化した
実用に耐えるDBDってないですかねぇ。
誰かDBD::Logとか作ってくれー。
>>387 CSV云々もそうだろうけど、SQLのパースにかかる時間も馬鹿にならないかと。
まぁPurePerlのDBDという時点で速度は期待できないと思うよ。
>>388 SQL::Statementもかなり遅いってことかー。
うーん。↓俺の今したいこと。
・PurePerlで
・DBDで
・CSVをSQLで処理
390 :
デフォルトの名無しさん :03/04/17 01:07
すいません。質問です。 ニュースサイトから指定範囲内の記事をタグを解析して取得したいのですが、 Perlで書くにはどんな感じになるんでしょうか。
393 :
デフォルトの名無しさん :03/04/17 09:34
0:$a = "abc"; 1: 2:sub subr { 3: my($a) = "bcd"; 4: print $a; 5:} こういう状態で 4行目でグローバル変数の$a、 つまり"abc"を表示させるにはどうしたらいいですか?
>>393 出来ません。
変数名を素直に変えませう
>>393 パッケージを明示すればできる。
print $main::a;
ただ、分かりにくくバグの元になるので、やはり変数名を見直すべき。
396 :
デフォルトの名無しさん :03/04/17 11:12
if (qq|<td class="c3" nowrap>(.*)</td>|) { $letter = $1; print "$letter\n"; } これで $1が取得できない理由はなぜでしょうか。 if文の条件にはマッチしてトラップされているのですが、$letterの中身は ヌルなのです。
じゃあ、$1 に何が入るのが正しいと思うの?
>>396 そりゃ正規表現を使ってないんだから当然だ。
>>399 そうじゃなくて、そもそも if文の中に書いてあるのは「ただの文字列」。
正規表現でもなんでもない。
if文が実行されるのはマッチしてるからではなく、単に文字列が評価された結果、
真になったので実行されてるだけ。
もう一度、基礎から勉強し直してきてください。
>>400 結果として判定部分に $_ =~ を追加することで目的は達せられました。
ありがとうございます。
$_ に対しての正規表現は「$_ =~」の省略が可能という認識だったので
そう表記したんですが・・・
if (m|<td class="c3" nowrap>(.*)</td>|) { $letter = $1; print "$letter\n"; }
>>401 > $_ に対しての正規表現は「$_ =~」の省略が可能という認識だったので
m//を使う場合のみ'm'の省略が可能だったはず。
m!!とかm##とかm{}とかの場合は省略できない。
ていうか俺は見にくくなるから常にmは付けているわけだが。
>>402-403 なるほど、どうやら省略できる部分を勘違いしていたようです。
勉強になりました。ありがとうございます。
(^^)
406 :
デフォルトの名無しさん :03/04/17 16:49
変な質問ですが、ファイルハンドルを囲む「<>」って 名前はありますか?(@@演算子とか) あと、この「<>」って「\n」毎に一行づつ読み込みますけど 任意の文字列までの文字を読み込むとかできますか?
>>406 行入力演算子 (line input operator)
デリミタは $/ で変更
>>407 ありがとうございます。
勉強になります。
409 :
デフォルトの名無しさん :03/04/17 17:53
質問です。 1 and { print "1 "; print "2\n"; }; このようなスクリプトで、「1 2」という出力を期待していたんですが、シンタックスエラーが発生してしまいます。 1 and { print "ok\n" }; ではちゃんと出力されました。なぜ上のスクリプトではエラーが出るのでしょうか
>>409 1 and do{
print "1 ";
print "2\n";
};
下の例が大丈夫なのは文が1つしかないから。
上の奴も,でつなげば文法的には大丈夫だが・・・
>>410 ありがとうございます。do{ 〜; 〜;}を使えばよかったのですね。
ところで、「,」で区切る方もやってみたのですが
1 and {
print "a",
print "b"
}
とすると「ba1」が出力されます。この「1」はどっから出てきたものなんでしょうか?
>>411 print ("a", print "b");
"a"が評価され、次にprint "b"が評価されます。
この時に"b"がprintされ、それが成功したとき、
print "b" は 1を返します。
そして、print ("a", 1) を実行し、"a1"と表示します。
>>412 これって結局Hash作ってるんだよね?
>>414 doじゃない場合はhash作ってるかと。
作ったあとすぐ消されるんだろうケド。
$str = "ぬるこ"; $str =~s/こ/ぽ/; ∧_∧ ( ´∀`)<$str
↑ 今時、吉牛コピペを出すくらい ナンセンス。
∧__∧ ( ´∀`)< undef
420 :
デフォルトの名無しさん :03/04/18 19:33
ActiveStateの.NetPerl(.NetSDK1用)なんだけど .NetSDK2じゃ使えん、なんとかならない?
421 :
■□■週間アイドル盗撮ランキング【4月】■□■ :03/04/18 19:39
$fugahoge = "fugahogestring"; この $fugahoge の先頭 1 文字を削除したいのですが、 どのようにすれば安全かつ効率的に行えるでしょうか?
423 :
デフォルトの名無しさん :03/04/19 17:39
>>422 $fugahoge = "fugahogestring";
$fugahoge =~s/^.//;
print $fugahoge;
424 :
デフォルトの名無しさん :03/04/19 17:40
>422 $fugahoge = substr($fugahoge, 1);
ありがとうございます。 変数に大きなデータが入っている場合は、どちらが高速ですか?
perl -wc でも strict でも実行するまで検出できないエラーの、 "undefined sub routine"(だっけ?)をデバッグ段階で調べる 方法はないでせうか? 関数名を typo してしまったときに痛いです。 # モジュールとかありそうですけどねぇ。
教えてください。 Perl for Win32 Build 316(v5.003_07?)から、ActivePerl v5.8.0に乗り換えたのですが、 処理の仕方が変わったようで困っています。 時間のかかる処理をするときに、プログレスバーのようなものを表示していたのですが、 ActivePerl v5.8.0では、最後にまとめて表示されるようになってしまいました。 プログレスバーを表示させる、うまい手はないでしょうか? よろしくお願いします。 for ($i=0 ; $i<5000 ; $i++) { if ($i%100 == 0) { print "*"; } for ($j=0 ; $j<1000 ; $j++) {} }
>>430 さん
恥ずかしながら、"$|"というものを知らなかったのですが、
$|=1;
とすることで期待通りの動作となりました。
ありがとうございました。
>>428 残念ながら、実行時まで待つしかないよ。
ここがPerlの苦しい所だが…その代わりにeval()やAUTOLOADという恩恵があるので我慢するしかないね。
∧_∧ ( ^^ )< ぬるぽ(^^)
∧_∧ ( ^^ )< ぬるぽ(^^)
初歩的な質問失礼します。 use CGI $q=new CGI を使ってフォームからのデータを取る場合 何個もあるデータを表示するならどうすればいいのですか? キーワード 'pass'から取るとすれば分かるのですが。。。 $pass = $q->param('pass');
packageとグローバル変数についてなんすけど、 次のようなサンプル作ったんですけど、 --- test.pl --- #!/usr/bin/perl use test2 ; my $g_test = "exist!" ; test2::test2() ; ---- test2.pm ---- package test2 ; use vars qw( $g_test ) ; sub test2 { print STDOUT "run test2.pm\n" ; print STDOUT "\$g_test=$g_test\n" } 1; ----------------- うまく行くと、 「$g_test=exist!」と表示されるはずなんですが、期待したとおりに動いてくれません で、質問なんですが? 1.グローバル変数の宣言、定義は合ってますか? 2.packageからのグローバル変数の参照は合ってますか? 3.Perlのオブジェクト指向的なコーティングに参考になるURLを教えてください。 以上です、また正しい記述をご存知でしたら、教えてくださいませ。
>>439 --- test.pl ---
#!/usr/bin/perl
use test2 ;
#my $g_test = "exist!" ;
use vars qw( $g_test ) ;
$g_test = "exist!" ;
test2::test2() ;
ん〜、やっぱりこうすべきでしょうか?
グローバル変数を定義するのに、use vars qw( $g_test ) ;の記述が気持ち悪くて、
$main::g_testって意味なら、myで行けるかも?と思ったんですけど。
とりあえず、この記述でこれで合ってますかね?
何方か、具体的な例示してもらえませんでしょうか、オナガイシマス。
そもそもモジュールからグローバル変数を参照してる時点でどうかと思うんだが。
>>443 ん〜、一応分って使ってるつもりだけど、
これでも、C/C++、Javaのプログラマとして飯食ってるんで。
因みに、グローバル変数の使用用途はシステム全体の
動作状態を示すのに使う予定。
446 :
デフォルトの名無しさん :03/04/21 00:04
>>444 全体の設定を書きたいなら、せめて全部をオブジェト試行で書いて、
すべての親クラスの_initメソッドで、
$self->config(Confit::Tiny->read('./system.ini'));
とかやってください。
メソッド内部ではクラス変数にアクセスするようにしておいて、
子クラスからは
$self->config->{foo}->{bar};
って感じで自然にアクセスできるようにしましょう。
どうか邪悪なソースを書かないでください。お願いします。
素人なんですが、LWPで特定のURLにPOSTするプログラムを作ろうと思って、
いろいろ書いています。一瞬上手くいったように見えたんですが、やっぱり
$ans->is_successを見ると失敗しています。
FreeBSD上で動かしているのですが、「tcpdump port http」を走らせて見ていると、
どうも外にパケットが出ていないようです。
perlでネットワーク越しにデータを投げようとするとき、以下のようなスクリプトでは
なにか問題有りますか? もし、他の点でも動かない原因がありましたら教えて頂けると幸いです。
よろしくおねがいします。
-------------------------
#!/usr/bin/perl
use LWP::UserAgent;
use
HTTP::Request; my($url, $post_data, $browser, $rq, $ans, $tmp);
############## user define ################
$url = '
http://www.hoehoe.com/hoehoe ';
$post_data = 'user_id=nnn&user_pass=mmm';
############## user define ################
$browser = new LWP::UserAgent;
$browser->agent('Mozilla/4.0');
$rq =
HTTP::Request- >new(POST => "$url");
$rq->content_type('application/x-www-form-urlencoded');
$rq->content("$post_data");
$rq->content_length(length($post_data));
$ans = $browser->request($rq);
if($ans->is_success) print " SUCCESS\n";
csvのデーターを取り出す処理なんだけど @data = split(/,/,$data); これで、\,をエスケープ文字として処理したいんだけど /,/の部分で一発で書くうまい方法ってない物かなぁ?
>>450 MSの仕様だと、ダブルクオートがエスケープになるから適用出来ない。
452 :
デフォルトの名無しさん :03/04/21 16:31
Perlの中で外部のプログラムを実行するのに execとかsystemとかありますけど、 実行した外部のプログラムの戻り値を受け取るようなことを したいんですけど良い方法はないでしょうか?
>>452 何を「戻り値」と呼んでいるかによって答えは変わる。
ある文字列に abが存在するかつcdが存在するかつefが存在しないかつghが存在しない という条件を書きたいとき 論理積などを使わず正規表現一発で現すにはどうしたらいいでしょう。 というかperlっぽい書き方はどんな感じなんでしょう。教えてください
出来ないと思う。
>>429 $|=1;
これ先頭に入れるのは無し?
解決してた。鬱氏。
>>452 `` とか qx{} だとか。
>>454 Perlっぽいのは
/ab/ and /cd/ and not /ef/ and not /gh/
だと思うケド。
>>449 /(?<!\\),/
>>454 /^(?=.*?ab)(?=.*?cd)(?!.*?ef)(?!.*?gh)/
>>459 (?<ayaya)がいけたのか。気がつかなかったです。
どーもありがと〜
>>458 こんなのあったんですね。
で、今試していたらsystemでも標準出力の文字列を取得できますね。
ありがとうございました。
以下を回避する方法として、何か良い方法ありますか? 所々に sleep(1); とか書いても駄目でしょうか? 「レンタルサーバでのCGI利用時の制限」 Perl の1プロセスあたりのサーバリソース占有量として、以下の数値を超過する 処理を行う場合はその処理はサーバ側にて中断され、以降の処理は行われません。 「CPU 使用時間…30秒 メモリ使用量…10Mb」 ちなみに cron で1日1回動かしている perl プログラムです。
>>463 $SIG{'XCPU'}='IGNORE'; してみ。
>>463 そのレンタルサーバに聞くしかないじゃないの
判断するのはあっちなんだから。
>463 1: cronを使わない方法を考える。 2: cronの使える鯖に移転する。
>>463 どっちかというとphp板の話題だろうな
xreaだろうが2研のアクティブスレッドランキングとかどうやってんだろうな
>>463 cronからCGIにアクセスさせてるのか?
HTML タグを Parse してくれるモジュールって、何がある?
Windows2000proにTkをインストールしたいと思い、
プロンプト上で
入力 ppm install Tk
結果 Error installing package 'tk': Could not locate a PPM binary of 'tk' for this platform
searchしてみたら、普通のTkが見あたらず、、
で、
http://www.activestate.com/packages/zipsからTk.zipをダウンロード d:\tempに解凍した中身をおく
D:\temp
+Tk.ppd
+README
+x86
+
という形
プロンプト上で
入力 ppm search /location d:\temp
結果 Tk [800.022] Tk - a Graphical User Interface Toolkit
入力 ppm install /location d:\temp Tk
結果 Error installing package 'tk': Could not locate a PPM binary of 'tk' for this platform
といった形でインストールできません。
バージョンはv5.6.0 built for MSWin32-x86-multi-threadです。
どなたか、インストールする方法を教えていただけないでしょうか?
宜しくお願いいたします。
HTML::Parser と、HTML::TokeParser は、どっちが(・∀・)イイ!! の?
>>471 ActivePerlv5.8.0を入れてください
標準で入ってます
475 :
デフォルトの名無しさん :03/04/23 00:08
ActivePerlでGD.pmを使いたいのですが、 PerlCRT.dllがない、というエラーで失敗します。 何度アンインスト→インストやりなおしをやっても、PerlCRT.dllが存在しない…… どなたか対処法をご存じないですか? CPANからPerlCRT.dll単体を引っ張ってきたら、一般保護エラーで終了しました(;´Д`)
>>474 助言ありがとうございます。
これを期に5.8.0を入れます。
でも、何でできなかったんだろ・・・
>>475 質問する時は、PerlのバージョンとOSを書くようにしたほうがいい
失礼しました。 Active Perl v5.6.1 build 635 Windows2000 です。
回答していただいた方ありがとうございました。 とても参考になりました。 webprog板のperlスレで同じ質問したら煽られまくって凹んでしまい 返事遅れてすいません。 こっちのスレは雰囲気よくていいですね。
>>479 見てる人は一緒だと思うけどな・・・
>>478 c:\>ppm install gd
でも駄目?
>>480 ありがとうございました。無事動きました!
perlネットワークプログラミングという本に以下のようなコードが載っていて、 use IO::File; $saveout = IO::File->new_from_fd(STDOUT, ">"); STDOUT->open('>log.txt'); STDOUT->print("Yippey yie yay!\n"); STDOUT->fdopen($saveout, ">"); 実行すると、 Can't locate object method "open" via package "IO::Handle" (perhaps you forgot to load "IO::Handle"?) at test21.pl line 3. というエラーがでてしまいます。 Linux+Perl5.6.1and 5.8.0,Windows98+activeperl5.6.1、別のPC上のLinux+Perl5.6.1など いろいろ試したのですが全て同じ結果でした。 これはPerlとして正しい動作なのでしょうか? 本のサンプルコードでエラーがでるというのは気持ちが悪いのですが。。。
>>Can't locate object method "open" via package "IO::Handle" (perhaps you forgot to load "IO::Handle"?) at test21.pl lin open関数を提供するIO::Handleがロードされてません、痴呆ですか? ってメッセージ。(標準関数のopenでない) 英語読めないということは小学生がPerlの学習か、 偉いな。 use IO::Handle; を書き込めばいいんだよ それで失敗したらしらないな 本のサンプルもときどきまちえるので、本(ほん)のかいしゃのWEB(うぇ〜ぶ)で 正誤表(せいごひょう)をみるんだよ。
484 :
デフォルトの名無しさん :03/04/23 17:32
>>483 こらっ、田吾作、いい加減なこと書くでねぇ。かあちゃんがあれほど口を酸っぱくいってるのに。
/lib/IO/File.pmのuse IO::Seekable;の前にuse IO::Handle;を書き込むだ。
英語が読めりゃいいってもんでもねぇぞ。馬鹿はいくつになっても馬鹿だな、かあちゃん、さみしいぞ。
>>483 >use IO::Handle;
もちろん確認済みです。
そもそも、IO::FIleはIO::Handleを継承しているとあるので、
本来use IO::Handle;はいらないはずではないかと思うのですが。
原書のnetwork programming with perlのerrataも確認しましたが、
それらしい記述はありませんでした。
それでどうしてもすっきりしないので、困って質問させてもらったのです。
>>484 助言ありがとうございます!
本当に助かります。
今から試してみて、結果はのちほど報告しますね。
>/lib/IO/File.pmのuse IO::Seekable;の前にuse IO::Handle;を書き込むだ。 だったら use IO::Handle; use IO::File; でいけないかい?
だめでした。。 STDOUT->printや STDOUT->fdopen などは初めからuse IO::File;を加えることによって問題なく動作するのですが。。 みなさんの環境ではどうなのでしょうか?
>>488 STDOUT(*STDOUT{IO})は"IO::Handle"オブジェクトであって"IO::File"オブジェクトではない。
そして、openメソッドはIO::Fileクラスで定義されている。
したがって、STDOUT->open()は失敗するのは当然だね。
多分その本は、テストをIO::FileモジュールではなくFileHandleモジュールで行ったのだろう。
IO::FileをFileHandleで置き換えれば動くと思うよ。
>>489 >STDOUT(*STDOUT{IO})は"IO::Handle"オブジェクトであって"IO::File"オブジェクトではない。
>そして、openメソッドはIO::Fileクラスで定義されている。
それで、IO::Handleオブジェクトにはそんなメソッドはないよ、
というエラーメッセージになっていたのですね。
File.pm, Handle.pmを覗いたところ、
おっしゃられるようにopenメソッドはIO::Fileで定義されていて、
IO::Handleには定義されていませんでした。
それから、use FileHandle;を使ったら問題なく動作することも確認しました。
とてもわかりやすい解説で、納得がいきました。
昨日の夜から気になって仕方なかったもので^^;
ありがとうございました。
全くの初心者(プログラム経験なし)なんですが、
Perlの超基本的な事を勉強したいので、
初心者が読むのに、お勧めなHPなどがありましたら
教えてください。(一般的な書籍でも構いません)
最終的にやりたい事なんですが、
英語の辞書(コウビルド)を無理やりテキスト化した物(作成済み)を、
PDIC等で読み込める形式にレイアウトを変更する為に、
膨大な量のテキスト置換を行ないたいのです。
(3万5千語の見出しがあって、1語に付き5〜6回の置換作業)
エディタで置換してると、1回の置換作業で
1時間くらい返事が帰って来ない状態になるし、
おまけに、へんてこな結果になったりして、困り果ててます。
ほぼ同様の目的で、以前の辞書のバージョン用のPerlのプログラムを書いて
公開して下さっている方がおられ、いい所まで変換する出来たので、
最終レイアウトを考えて、少し変更するだけで済みそう??
なんじゃないかと、皮算用してます。
(参考)
ttp://neo.pharm.hiroshima-u.ac.jp/faq/cobuild.html 上に書いてる、Perlのプログラムを公開されている場所です。
誘導、宜しくお願いします。
>>491 宿題、研究、仕事は自分でやれボケ
馬鹿がム板にperlスレ立てるからこういう痴呆がまぎれこむんだよ
>>491 は宿題には見えませんけどね。
こういうスクリプトを書いてくれ、っていう「発注」でもないし、
そんなに目くじら立てなくてもイイのでは?
(まあでも、この板にPerlスレがあるのは確かにちょっと場違いなのかもしれません)
>>491 さんが気づいてないのは、それなりに筋のいい人はその程度のことは
自分で何とかしてしまうので、わざわざ経験のない超初心者向けの「HP」とか書籍を
読んだりはしないということですね。(だからなにを薦めていいかもわからないし)
>>492 さんが嫌がってるのは、そういう情報を持っている元超初心者とかが
たかってきて超初心者向けの情報交換サロンになったらウザいなあ、
といったところでしょうか。
大昔の月刊ASCIIにはawkとかsedの連載があったりしたけど、
エンドユーザーがこういう類のテキスト処理するニーズっていうのは
結構あると思うんですけどねえ。。なんかいい本とかないんすかね。
>>493 >(まあでも、この板にPerlスレがあるのは確かにちょっと場違いなのかもしれません)
何故?理由がわからない
>>494 Perlの使い方をCGI以外に知らないからでしょ。
>>493 Web板ならいいのか?
Perl = Web作成用言語かよ
WebProg板にあったら「Perlは糞。PHPの時代」とか言ってるくせに ム板にあったら「WebProg板へ逝け」ってことか。 どっちやねん。
>>494 結局のところPerlって片手間にやるものなんじゃないか、って
気がするんです。自分のわかる範囲で安楽に使ってりゃいいわけで。
わざわざ人に質問してまで使うもんかな、って感じですかね。
Perlごときで人に質問しなきゃならないような人って・・・みたいな。
さらに
>>492 みたいに、素人がム板に出入りするんじゃねえ、みたいな
スタンスで来られたら、なおさらPerlの出る幕じゃないですよね。
別に、CGI用だから板違い、とかいう話ではないです。
>>498 Perlが素人の道具?ほんとにCGIしか知らない臭え。
マジレスすれば、どっちかっつーと玄人好みだぞ。
例えば
>>482 みたいな質問は、俺は読んでて楽しいわけですが、
>>482 が何かの用事があって仕事を片付けるためにスクリプトを書いてる最中
だったとしたら、そんな質問するより、他の楽珍な書き方を考えたほうがいいわけです。
凝ったことも色々出来るわけですが、それは、
「凝ったことが好きで、凝ったことが出来る能力がある人」が
勝手にやってればいいわけで。(人に質問してまでやらなくても、みたいな)
>>500 「玄人」っていうと、俺のイメージだと、そういう人はこういうスレで質問しないです。
(聞くまでもなくなんとかできちゃいそうです)
>>501 失せろよ。あんたはここを見なくてもいいだろうが。
荒らすのが目的か?
考えて救いを求めるものは助けても、 丸投げするやつを助ける義理はないわな・・・
何かサルが一匹紛れ込んできたな。
>>503 禿げ同。このスレに限らずム板でも、2ちゃん以外の掲示板・ML・現実社会でも同じだわな。
まあ(人間的に)頭の悪い奴にはわからんだろうが。あ、人間じゃないかw
>>505 俺が色々書いてるのは
>>492 に対してサルみたいな反応する必要があるのか?
という話なのです。
お前自分の文章読み返してみろ。あほみたいだぞ。
お前のレス全部まとめると「
>>492 さん、言い過ぎじゃないでしょうか?」の一文しか内容が無いよう。
>>506 全くおっしゃるとおりでございます。失礼しました。
「
>>492 さん、言い過ぎじゃないでしょうか?」で逆に
初心者の皆さん、ウェルカムっていうスレの流れにしてしまっても
板住人の皆さんにご迷惑かと思いましたもので。
>>505 聞いてない事に内容を展開する必要はないわなってこったね・・・
んで、漏れは本など使ってPerlを勉強したことがないのだが、資料っていうのなら駱駝本あればいいんじゃないの?
『はじめてのPerl 第3版』 3600円 5月に出るなり。
>>508 (ひそひそ)駱駝本、2冊あわせて10000円ですよ!!
511 :
動画直リン :03/04/24 14:26
新P国より、りゃま本の方が27.4倍良いというのに1パール!!
らくだ本最後まで読む気力がない
>>514 半分以上はリファレンスだから、必要なときに読めばいいんじゃない?
516 :
デフォルトの名無しさん :03/04/24 15:06
>>515 いるんだよ、「読むこと」自体を目的化させてしまっている倒錯者たちが。
そして、ばりばりPerlのプログラムを書いているPerlハッカーに向かって、
「君はPerlのプログラムを書くのがうまいかもしれないが、わたしは駱駝本を
全部読んだので、Perlについては君より偉いんだぜ」と威張ったりするのだ。
そして、100行の下手くそなプログラムを半年もかけて書いて、「これが本物の
Perlの天才が書いたプログラムだ」と見せてまわったりするの。
>>516 半年かけた100行ってどんなだろ・・・
よっぽどトリッキーな書き方なのか・・・
それとも、ただ遅いだけなのか・・・
しかし、遅いにしても半年で100行は遅すぎる・・・
ビシバシ一行で書いていってるのかなぁ〜・・・
気になるなぁ〜・・・見てみたい。
今日書いたソース #
バグがまったくないんですよ。
てか、Perl好きなら駱駝本読破くらい苦じゃ無いと思う マヂレス 強いて言うなら腕が疲れるのだけは頂けないな
523 :
デフォルトの名無しさん :03/04/24 21:46
>>522 苦な人は苦でしょう。
知っていることを延々と説明されて、下らないオヤジギャグブチかまされて。
迷惑極まりない!!!
読むのは苦じゃないけどずっと立ってるのが辛い
>>524 あの本でずっとハァハァしてる香具師はかなり珍しい。
529 :
デフォルトの名無しさん :03/04/25 03:10
ニュースサイトのある一部のコラムだけを抜き出すプログラム のサンプルありますか? もう誰か作っている気がするので。。
立ち読みは万引きに等しい。
つまり、万引きは立ち読み程度の罪ってことだな。
>>531 技術者なら本屋の店員の言葉を真に受けるな
仕様はころころ変わります。
534 :
デフォルトの名無しさん :03/04/25 08:14
perldocでいいよ。
535 :
bloom :03/04/25 08:26
>529 著作権法違反。
537 :
デフォルトの名無しさん :03/04/25 10:06
cisco製品にtelnet接続できるライブラリ(Net-Telnet-Cisco) っていうのがあるらしいのですが、使われた事ある方いらっしゃいますか?
<>ではリターンをユーザーが入力するまで、キー入力が読み込めません。 ユーザーがリターンを押す前にキー入力を得る方法を教えてください。
(σ・∀・)σゲッツ
そんなことよりミスラとまんk(ry 思い切りスレ違い
好みの問題なのかもしれませんが、、
最近 use strict してプログラムを書くことが多くなってきたのですが、
# 綺麗に掛けるのでstrictが気に入りました^^
グローバル変数として利用したい変数はどのように定義するのが王道と
いうか、正道というか、美しいというか、良いのでしょうか。
例1:
use strict;
my $hoge = 'hage';
main()
sub main {
print($hoge);
exit;
}
例2:
use strict;
$::hoge = 'hage';
main();
sub main {
print($::hoge);
exit;
}
私はモジュールの中でも使いやすいように、例2を使っているのですが、
そんなんは邪道だ!とか、この方が良い、などありましたら教えて頂け
ますでしょうか。
>>540 どこから来たんだ。。。
例3: our $hoge = 'hoge';
>>541 私なら例1か・・・
この場合、$::hoge って $main::hoge の省略形だし
中途半端っぽく見えるかもっていう個人的心象の範囲の問題。
(見りゃわかるからいいけどね)
>>542 our これ知りませんでした。。(恥
これ頂きます。
>>543 ご意見ありがとうございます。
our 動作しない。。(´・ω・`)ショボーン 弄り倒してきます。
myはファイル終わった時点でスコープが閉じるので、グローバルじゃないコトに注意。 requireするようなファイルの中だけで使うならmyのがいいかな。
547 :
デフォルトの名無しさん :03/04/25 20:34
Perlだけでなく、どの言語でもそうだと思うのですが、 上達のコツは、とにかくPGを組むこと!ってよく言いますよね? でも、変な癖がつくとなかなか直らないものです。 読むだけで勉強になる 読むだけで綺麗に書くコツがつかめるかも っていうソースを紹介してくれませんか?
>>547 いやその。
色々なソースを見て、綺麗だのそうじゃないだの判断がつく
目を自力で持たないと。
>>547 のび太君がドラえもんに頼み事してるみたいだな
いいソースってのは、有るんじゃけど 理解出来る程度に自分で作れなければ何処がいいのか解らんという・・・
551 :
デフォルトの名無しさん :03/04/25 21:43
perlの勉強を始めたばかりの者です $nに任意の物を入力してもらってそれが整数かどうか判定するのに $n=<>; until($n=~/^[0-9]+$/){整数じゃないぞ、もう一度入れ直せと意味の文とその入力} としました、なぜuntilの条件文の演算子はeqではいけないんでしょうか?eqと=~の違いがよく(教科書を読んでも)わかりませんでした eqとした場合parl内部ではどう言う判定になるのでしょうか? ちなみに実数の入力じゃないと、とか拡張したいのですがこの方法では非常に面倒になりそうです、簡単なものはありませんか? 長くなってすいません、おひまありましたらご教授願います
なぜuntilなのか、とかそもそも教科書って何を読んでるのか、とか、 parlって何?とか、"perlの勉強を始めたばかりの者"って逆撫でしたくて書いてるの?とか、 なんだか疑問点が沢山あるわけですが。 とりあえず eq は 左右が文字列的に等しい場合に真を返します。 正規表現は評価されません。(つかどう評価されるか私は知りません)
=~ は正規表現の演算子 eq は文字同士が等しいかどうかを判定する演算子。 質問のケースでは、 数値を比較するため、 eq を使うことはできません。 $n = 1; until($n eq 1){ ... } 等と特定の一条件を示すことはできても、$nが1以外の場合条件が成立しません。 んで、正規表現を使う必要があるのですが、 =~ もしくは !~といった ~を使った識別子となります。 あと、 until($n =~ /^\d+$/) は if($n !~ /^\d+$/) と一緒。記述方法の問題。もうちょっとperlの演算子と正規表現を調べてみるとよいかと
いろいろな疑問点ですが、本人が馬鹿並に知識がないのと呆けてるために出たミス等で 本人に馬鹿にするだとか、そういった意図は有りません 御二方とも返事ありがとうございます つまりeqを使った場合/^[0-9]+$/と言う文字列と真偽を比べてて 本来表したかった、0-9までの文字でできた一字以上の文字列と言う意味を 失うってことのようですね。 演算子と精気表現頑張って勉強します、ありがとうございました
>>554 untilとunlessがごっちゃになってない?
557 :
デフォルトの名無しさん :03/04/25 22:49
無能を誇らず本を嫁。
おぉ。 ミスっておった。
>>545 ourはPerl5.6から。最新版にしる。
ところでPerlに慣れ親しみすぎたせいで、
C言語でやることがめんどくさくてちっとも覚えられません。
C言語を駆使したスーパーハカーになるにはどしたらよいですか。
ああPerlって簡単で素敵。。。
562 :
デフォルトの名無しさん :03/04/26 03:46
perlのファイルハンドルって、プログラムの中でグローバルなの?
>>562 local *FH; とか use Symbol; して my $fh = gensym(); とか。
564 :
デフォルトの名無しさん :03/04/26 14:39
ちかごろError.pmというのを見つけて、ルンルンとtry..catch構文使ってコード書いてます。
ところで最近とある記事を読んだら「ネストしたtryはメモリリークするよん」とか
書かれているではありませんか!
理由を読んでも渡しにはサパーリなんですが...
tryブロックの中で「tryを使ってる関数」を呼び出してもメモリリークって
起きちゃうんでしょうか!?
どなたかErrorモジュール使われてる方います?
ちなみにとある記事は以下っす。
ttp://bulknews.net/lib/doc-ja/etoys.ja.html
そもそもPerlでメモリリークなんて起こるのか?
>>565 ね、そう思うんだけどさ。。。
ただ、環状リストや自己参照作っちゃった場合はあり得るって話は聞いたことあるよ。
プロセス終了すればOSが解放するんだろうけど
長いプロセスの場合は問題になるって。
便宜上メモリリークという言葉を使っているだけの気がする。
っつーことはデーモンみたいな 長いプロセス組まなきゃいいってこと? 解決!?
>>565 Windows版のPerl5.6の時はメモリーリーク発生しておった。
ガベージコレクトの動作が緩慢っぽい・・・
んで、Perl5.8では問題解決したっぽいけど、perl56.dll経由すると起こるっぽい
PHPもWindows版のみメモリリークを起こすとか・・・
後スレッドとか使うと開放されないなぁ・・・ コレはモジュールだから別問題か
せっかくのPerlなんだからそんなこと気にしないでプログラミングしようよ(^o^=)
>>572 仕事で使うとなると、そうも言ってられないので。
>>567 記事にはtryの実装が下の$subref達に相当するクロージャなので
my $foo;
$subref1 = sub {
$subref2 = sub {
$foo++;
};
};
のような書き方で$fooを使うとリークするってあるんだけど
これってプログラム終われば全部の変数は解放されるよねぇ?
記事自体がmod_perlを前提にした話だったからなのかな?
べつにPerl自身の問題やモジュールのバグとかそういうことじゃないらしいです。
>>564 の解説希望。
あのコードが実行されるたびに変数のコピーを作って、
いつかメモリを食い尽くすって事?
ActivePerl5.8でもリークするね。インタプリタの終了時には破棄されるみたいだけど。(環状リンクでも正常に破棄される) あとは、そのコードのケースなら、最後に$fooをundefすればリークは起こらないみたい。(って当然か) tryの中でtryを使う関数を呼び出す分には何の問題もないよ。
>>575 そうです。それです。
Error.pmのtry-catch文は
my $foo;
try {
# some stuff...
try {
$foo++;
# more stuff...
} catch Error with {
# handle error
};
} catch Error with {
# handle other error
};
のように書くのだけど
tryは$fooへのクロージャになってて、
tryするたび$fooのコピーができるからいずれメモリが尽きるって話です。
(URLは
http://bulknews.net/lib/doc-ja/etoys.ja.html )
ただ、mod_perlみたいな常駐プロセスじゃなければ関係ないよね?
っても思うし、どうなんだろうと思ってたわけです。
要はperlのガベージコレクタは完璧ではないと。 …と言ってみると当然の事のような気がしてきた。
>>577 よく理解できてないんだけど、some stuff のところで
ループの記述があると、(つまり、内側の try を何度も
呼び出すと) $foo のコピーがループのたびに作り出されて
メモリリークになるってこと?
>>579 たぶんそう。
「$fooの宣言より内側のスコープにループ作ってて
そこでtryした場合は」ってことでしょう。
いや、ちがうか。
tryの実装がグローバルスコープのクロージャならば
$fooへの参照はずっと残るから、
$fooの宣言より外側でループしててもリークすんのか?
ただ、そう考えるとtryをネストするとかしないとかいう話は関係なくなる。
ややこしくて俺もようわからんです。スマソ。
>>578 いや、リファレンスカウント式のGCとしては
Perlは完璧なんじゃない?(レスによるとWin版ではバグがあるみたいですが…)
ただ、この場合その限界が露呈してくるというか
576さんの言うように(レスサンクスです)、
DESTORYメソッドに相当することを自分でやる必要があるんでしょうね。
他言語に似せて try ... catch ... の構文を無理矢理作るError.pmよりも、 perlの eval をそのまま利用するモジュール作った方が良いと思うが eval{ ... if (わざと例外を発生させる場合) EX->throw(...); ... }; if (EX->catch(...)){ ... } EX->throw(...)は内部で die を呼び、EX->catch(...)は$@をチェックして catchできる場合は真値を返し、できない場合はさらにdieすればよい。 開発時のEXモジュールはcatch, throw内で詳細なスタックトレースを出力させて、 運用時はEXモジュールを簡単なヤツに入れ替えるなんてのはどう?
583 :
デフォルトの名無しさん :03/04/27 10:44
カレントディレクトリにモジュールを置いて使ってて、 既に同じモジュールのバージョン違いがインストールされている場合、 カレントディレクトリの方を優先して使う場合はどうすればいいですか?
require './module.pm'
Error.pmの中身は知らんけど ラクダ本に eval -> if($@) のWrapper乗ってたよ tryとcatchにしただけ
<>ではリターンをユーザーが入力するまで、キー入力が読み込めません。 ユーザーがリターンを押す前にキー入力を得る方法を教えてください。
>>586 =538 氏ね
538デフォルトの名無しさんsage03/04/25 12:24
<>ではリターンをユーザーが入力するまで、キー入力が読み込めません。
ユーザーがリターンを押す前にキー入力を得る方法を教えてください。
551デフォルトの名無しさん03/04/25 21:43
>>538 Term::GetKey
前にも同じ質問を見た気がするな。 getcを使えばSTDINから1文字読み取るが、 基本的にバッファリングされるので復帰文字を入力するまで値が帰ってこない。 バッファリングを無効にする方法はプラットフォームによって異なる。 後は自分で調べろ
590 :
デフォルトの名無しさん :03/04/27 19:39
:$a << 'eot'; :こんな感じのことしたいんですが、何か方法はないでしょうか :つまり複数行にわたる文字列をサラッと書いて変数にいれたいわけです。 :eot : :print $a; こんな感じのことしたいんですが、何か方法はないでしょうか つまり複数行にわたる文字列をサラッと書いて変数にいれたいわけです。
すんません、↓で解決しました。 $a = << 'eot'; こんな感じのことしたいんですが、何か方法はないでしょうか つまり複数行にわたる文字列をサラッと書いて変数にいれたいわけです。 eot print $a;
593 :
デフォルトの名無しさん :03/04/27 19:46
>590 my $a; $a = <<'EOT'; これで、 いいんで ないかい? EOT print $a;
print <DATA>; __DATA__ こういう 方法も あるでよ。
my $a; $a = ' ぶっちゃけ これでも いい ';
房の質問ですが。。。 *.cgi?a とかありますよね? このように、?aならαという処理をする、?bならβという処理をする というふうにするにはどうすればいいのでしょうか? あと、これってGET,POST関係ありますよね? トクトクです。動作可能かもお願いします
>>597 プログラム・ソフトの使い方は PC 初心者板やソフトウェア板へ。
ウイルス、ハッキング・クラッキングを求めるような発言は禁止です。
Javascript は Web 制作板、CGI は Web プログラミング板へ。
業界談義、愚痴はプログラマ板へどうぞ。
ゲーム関係の話題はゲーム製作板へどうぞ。
ネタ、板とは関係の無い話題はご遠慮ください。
×巣 ○素
>>597 GETとPOSTの違いは$ENV{REQUEST_METHOD}を調べれば分かるよ。
ところで動作可能とはどういう意味ですか?
>>606 デコード云々の前に$ENV{QUERY_STRING}の意味分かってるか?
>>608 なんか、Webprogと両方で答えているので、おこられそうですが、
?の後の値を格納する変数ですね。
>>609 それが分かってんだったら
if ($ENV{QUERY_STRING} eq 'a') {
α
} elsif ($ENV{QUERY_STRING} eq 'b')
β
}
でいいだろが。
>>610 いえ、それを聞きにきて、教えてもらったんです。
えと、それでデコードといいますと?
半角英数しか使わないので必要ないですよね?
>>611 だれかが、.cgi?あいうえお でアクセスしてくる可能性を考えんのか?
別にいいけど。
>>612 そんな request は無視すりゃいいだけだろ。
板違いなんだから答えるなよ
615 :
デフォルトの名無しさん :03/04/27 22:24
よく s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg; が使われますが、なぜ早そうな s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("H2", $1 )/eg; を使わないんですか?
>>617 いや、後者のほうがタイプ数少ないから「早い」んだろう。
>>616 KENTって誰?
>>619 実際のところそんなにループすることないので、
どっちでもいいじゃんと思った
>>620 汚いソースばら撒いて、Perlは醜いという間違った認識を人々に与えつづける悪の元凶
Kent BeckってPerl使ってんだっけ?とか思ってしまった。
624 :
デフォルトの名無しさん :03/04/28 15:56
Perlで、コマンドを実行してその実行結果を変数に取得するということはできるでしょうか? 例えば、 > ./hogehoge 123 ABC 456 というコマンドの時に、Perl内で変数に 123 と ABC と 456 を取得したいのです。 教えてください。
625 :
デフォルトの名無しさん :03/04/28 16:33
Sed, AWK には環境変数 sedfile, awkpath なんてものがあって、 set sedfile=c:\sedscrip\ set awkpath=c:\awkscrip\ なんて感じでスクリプトが存在するパスを指定できるのですが, Perl にはこういうものはないのでしょうか?
>>625 use lib '/home/aki/lib';
とか?
bat例 @ECHO OFF set sedfile=c:\sedscrip\ PERL -x C:\hogehoge.bat GOTO END #!/usr/local/bin/perl $sedfile = $ENV{'sedfile'}; print $sedfile; __END__ :END
>>624 open (PIPE, "ls |");
@ls = <PIPE>;
close (PIPE);
print @ls;
>628 うまくできました。 ありがとうございました。
630 :
デフォルトの名無しさん :03/04/28 19:52
変数に $buf に Temp.= 0.0, 0.0, 0.0; Rot.= 6136, 51923, 25961 Vcore = 1.71, 1.49; Volt. = 3.38, 5.16, 11.31, -3.39, -6.14 という文字列が代入されているのですが、この内容を取得したいのですがうまくいきません。 ($temp1, $temp2, $temp3, $vcode1, $vcore2, $volt1, $volt2, $volt3, $volt4, $volt5) = ($buf =~ /(\d+\.\d+)/g) ではダメなのでしょうか?
>>626 また、ソフトウェアはコードよりも保守とサポートが重要だと実証した人でもある。
>>630 「どううまくいかないか」を書け。
気づいた点
・$vcode1 って変数名ミスタイプ?
・マイナスの値は符号がとれちゃうけど良いの?
>>630 とりあえずuse strictしてからもう一度書き込もう
聞く側の最低限のマナーだ
>632 変数名はtypoです。符号は取れてもかまいません。 >633 すいません…
つっか質問でコード部のtypoって何だよ。 余計な詮索しなきゃいけなくなるだろ。 何でエディタからコピペしないんだよ。
636 :
デフォルトの名無しさん :03/04/29 00:29
perldoc(_EOF_以下の部分)の書き方を解説してる日本語のサイトでお勧めないですか? Googleで探してもめぼしいのがないもので、、、
637 :
デフォルトの名無しさん :03/04/29 00:47
コボルからperlの呼び出しって可能でしょうか? 今コボルのCSV形式がいまいちで "(ダブルコート) を一度perlで[@ダブル] とかに置き換え、 さらにこの変換後のファイルをコボルCSV形式で読み込み、 コボルよりperlを呼び出しこの[@ダブル]を " に置き換えるというようなことをしたいのですが。
638 :
デフォルトの名無しさん :03/04/29 00:48
「POD」で検索しなさい。 hippo2000氏の超訳サイトあたりにいい解説があったきがする。
639 :
デフォルトの名無しさん :03/04/29 12:48
perldocのnroffモードだとハイフン(-)がどうしても潰れちゃう。 perldoc DB_File とか見てもらうとわかるんだけど、-> が > になっちゃってます。 これって仕様ですか? ちなみにpod2htmlとかだと大丈夫。
>>624 $a = `./hogehoge`;
じゃだめなの?
>>637 多分オープン系のCOBOLと推測しますが、perlからCOBOLのプログラムを呼ぶなら
systemを使えばいいのですが、逆はCOBOLの側でどういう作法でやるかを
調べるしかないのでは?(ちなみに私は知りませぬ)
普通のプログラムと同じようにPerlで書いたスクリプトが呼べるかどうかと言う意味では、
OSと呼ぶ側の言語によって差異がありますが、呼べることは呼べますね。
あと、[@ダブル] をダブルクォーテーションに置き換えるだけならそのままCOBOLでやった
ほうが早い&速いのでは?まあ、コボルCSV形式というものがどんなものかわからないのと、
COBOLはよくわからないのでなんともいえませんが。
つうかcobolスレにいきなと 最初に言うべきでしたな
644 :
デフォルトの名無しさん :03/04/30 04:37
配列の数だけループさせたいとき こういうふうに書いてるんですが for(0..(@a-1)) { $a[$_] ++; print $a[$_]." "; } もっとスマートにかける方法ありませんか?
>もっとスマートにかける方法ありませんか? この条件の部分です→ for(0..(@a-1)) {
for(@a) { $_++; print $_." "; }
print ++$_." " foreach (@a); 個人的にはforとforeachは使い分けたい。(内部的には一緒とはいえ)
フツー$#a使うわなぁ・・・ for(0..$#a) {; $a[$] print ++$a[$_]." "; } あとこんなんとか・・・ foreach(@a) { print ++$_." "; }
>>648 ミス
for(0..$#a) {;
print ++$a[$_]." ";
}
>>647 ループカウンターの値が必要でなければforeach使いますわなぁ・・・
print ++$a[$_]." "; こんなん書いたらぶっ飛ばされるわな。
>>644 grep { local $\ = " "; print ++$_; } @a;
なんか効率が悪そうだが…
スマートと言えばスマートか?
スマートって賢いって意味だろ。 みじかけりゃスマートってもんじゃない。
速度的に言うとこうなるっぽい
でも、>>
>>644 的にはスマートとは言えないのだろ?
while(shift @a){
$_++;
}
while(shift @a){ $_++; } と $_++ while(shift @a); ってどっちが速いかのぉ
>>651 map{ print ++$_ . " "; } @a;
のほうがよかないか?
メモリー食うからこんな記述せぬけど
for ($i=0; $i<(scalar @a); $i++) {
$_++;
print $a[$_];
}
>>654 一緒じゃないの?
Perlも、コンパイルする時、多少の最適化があると思うけど?
ちょっと間違ってる。 $a[$i] だな。
shift って、@a 再利用する場合どうすんだよ。
黙って foreach (@a) にしとけ、
>>644 見た感じ速度は問題じゃないっぽいし
まぁ
>>647 が普通だろうなぁ。.じゃなくて,のがいいと思うケド。
mapで値変える上に戻り値ナシは邪道すぎ。
openとかで外部のコマンドを起動して、 その外部コマンドのリターンステータスを得るにはどうしたらよいのでしょうか?
>>660 なんかこのスレその手の質問多いね。
過去200くらいに2,3回答があると思われ。
スレ違いかもしれませんが、、 別のpc上のoracleに対してアクセスしたいのですが モジュール等で簡単に行うことは可能でしょうか。 自分の環境にoracleは入っていない前提です。 DBIモジュール等はローカルにoracleがないと無理なんですよね。
ふーん。Oracleって不便だねぇ。
>663 どっかにOracleクライアントインストールして DBI::Proxy でアクセス できたっけ?
DBIで普通に外部のMySQL鯖にアクセスしてますが、何か?
667 :
デフォルトの名無しさん :03/05/02 07:47
print $a, "\n"; のうしろの"\n"で改行できるんだけど、printって引数ひとつじゃないの? print $a, $b, $c, $d, "\n"; みたいなことはできないし。 どういうこと?
>>667 ひとつとはかぎらない。
print FH "string";
>>667 > print $a, $b, $c, $d, "\n"; みたいなことはできないし。
できるが。
引数というか渡せるのは2つだな。 print ファイルハンドル リスト perldoc -f print をどうぞ。
会議室予約システムをPerlのNDBMで作ってるんですが、困ってます。 以前作ってSolaris+Apacheで動かしてたときは、hoge.dirとhoge.pagができ たんですが、今度、RedHat Linux 7.3+Apache1.3で同じのを動かしたら、 hoge.ndbm.dbという1ファイルしかできず、検索が効かなくなってしまいまし た。 hoge.ndbm.dbの場合、検索は、以下のじゃだめなんでしょうか。(長すぎる 行があるって出るので改行してます。) tie (%yoyaku, NDBM_File, "/var/www/html/yoyaku/yoyaku.ndbm", O_RDONLY, 0644) or die "$!\n"; foreach (sort keys %yoyaku) { if ($_ >= $today) { @data = split(/\t/,$yoyaku{$_}); print "<tr><td>$data[0]年$data[1]月$data[2]日($data[10])</td><td>$data[3]時$data[4]分</td><td>$data[5]時$data[6]分</td> <td>$data[7]</td><td>$data[8]</td><td>$data[9]</td></tr>"; } } untie %yoyaku;
>>671 ですが、自己解決しました。
データベースファイル名をyoyaku.ndbmにしていたのがいけなかった
ようです。.dir、.pagの場合は、ドットが2つあってもいい
(yoyaku.ndbm.dir、yoyaku.ndbm.pagを読んでくれる)が、
.dbの場合は、だめなんですね。データベースファイル名をyoyakuに
して解決しますた。
基本的なことかもしれませんが、わからないので質問させてください。 flockに関してなのですが、ファイルをロックする時その対象は「ファイルハンドル」になると聞きました。 別々のCGIスクリプトから同一のファイルをopenし、その時それぞれのスクリプトで違うハンドルをつけていたらどうなるのでしょうか。 具体的には以下のような感じです。 #===CGI 1=== open(FILE, "+< ./file.dat"); flock(FILE, 2); truncate(FILE, 0); seek(FILE, 0, 0); print FILE "あいうえお"; close(FILE); #===CGI 2=== open(DATA, "+< ./file.dat"); flock(DATA, 2); truncate(DATA, 0); seek(DATA, 0, 0); print DATA "かきくけこ"; close(DATA); まあ例えば上記のような2つのスクリプトがあって、これがほぼ同時に実行された場合ですね。 これだとファイルハンドルが違うから、きちんとロックされないことになるんでしょうか。 それともファイルハンドルは関係なく、対象になるファイルはロックされるんでしょうか。 よろしくお願いします。
GWは「初心者」が増えるねぇ。
>>673 ファイルハンドルは関係ない。
sub a($){ $fuga = @_; print $fuga }
$hoge=0;
a($hoge);
と同じ。
ありがとうございました。前々から気になっていたことだったので、そう聞いて安心しました。
677 :
デフォルトの名無しさん :03/05/02 22:33
for と foreach の違いをだれか教えていただければと。
記憶が確かならまったく同じだったはず
680 :
デフォルトの名無しさん :03/05/03 05:56
timeからtimelocalで日付や曜日を取ることができました。 休日を取るにはどうすればいいのでしょうか?
681 :
デフォルトの名無しさん :03/05/03 06:02
PerlでAAを整形したいのですが、MSゴシックのフォント幅などを取得するモジュールは 存在しますか?
>>680 >休日を取るにはどうすればいいのでしょうか?
仮病を使う、とか。
>>680 Date::Japanese::Holiday
使い捨てスクリプトじゃないプログラムをperlで組んでる方にお聞きしたいのですが、 どの程度コーディングスタイルを決めてますか? ウチはいい加減だけど大体こんな感じです。 ・サブルーチンの引数を取るときの作法 × my $引数1 = shift; my 引数2 = shift; ○ my($引数1, $引数2) = @_; ・引数は必ず ( と ) でくくる。ただし、 print だけは例外。 ・@_や$_を省略できるケースでも省略しない。 ・@_や$_は、よほど単純な処理でない限り、きちんと命名した変数に代入してから使用する。 ・条件判定は必ず先に書く。 × &サブルーチン(...) if (条件); ○ (条件) && &サブルーチン(...); ・名前空間の汚染は可能な限り拒否。 × $x = encode_base64(...); ○ $x = MIME::Base64::encode_base64(...);
俺的には && の時点でダウト
&サブルーチン(...) if (条件); でいい
&& や || の代わりに and や or を使う
if (条件){ &サブルーチン(...); } にする
どれが好み?
>>689
>>690 場合によりけりだけど、&& || は使わないで and orにするよ
簡潔に書ける場合は 〜 and 〜;
条件よりも処理が大事なら 〜 if(〜)
実行文多いなら普通に if(条件){ブロック}
幾つかの方法を使うからといって統一が無いわけじゃなくて
何が大事か とか、コード書いたヤツがなに考えてたか が見て分かるから
(無駄なコメントなんかよりもずっと)
Perl使える人だけなら、下手にC風に書くよりもずっと見通しがいいよ
不幸にもPerl分かんない人が含まれてるなら、涙を飲んでC風にするけど
> ・@_や$_を省略できるケースでも省略しない。 省略できるケースは省略した方がいいと思うが。 例えばwhile中のchompなど。 まぁとりあえずperlstyleを読め、と。
693 :
デフォルトの名無しさん :03/05/03 14:54
$_より、$splited_letterとかやるほうが分かりやすい。 次第にモジュールが大きくなってくると、省略のメリットよりデメリットのほうが大きくなる。 そして、なにより use strict -w に怒られる。
>>691 ウチの場合は、「 〜 if(〜) 」の表記でデバッグ中に後ろの条件を見落として
悩むケースが多発するので、先に条件を書くように統一してしまいました。
ちなみに && || は少数派のようで、記号文字だとぱっと見たときに目立つから
いうのが個人的な理由だけど、多数派は and or を愛する模様。
最近では、if(条件){ブロック} の代わりに
{
(条件A) || last;
...
(条件B) || last;
...
}
なんて書き方にしてしまうことがよくあります。
後で条件や処理が追加されてもネストが深くならないので。
>>692 どこで変数の中身をいじったかを調べたるときに見落としなくgrepできるのが、
@_や$_を省略しないとか命名した変数に代入するとかの理由です。
(命名した変数に代入は絶対ではなく、スピードが重要な場合は例外あり)
目立つとか言うのが重要なのかどうかは知らんが、 優先順位で誤作動が起きる可能性が少ないと理由で and or を選んでる
>>694 grepを考えると確かに$_は不便かも。
私もブロックが長くなるときには for my $hoge みたいにしてるかな。
ブロック内が短い時(5行まで?)は省略しちゃいます。
&& || については and or で統一してます。
&& || はそれこそ値についての評価の場合に限定して使用。
$foo ||= "xxx"; だとか デフォルト値を設定する場合とか。
まぁそれ以前にand orをあんまり使わないでifを使うコトが多いかな。
(条件) and 動作; にするか 動作 if 条件; にするかは今も迷ってる気。
条件が後ろに来ると読みにくい、には一理ありかと。
698 :
デフォルトの名無しさん :03/05/03 15:31
last if … ; はよくつかう。
>>688 >× &サブルーチン(...) if (条件);
>○ (条件) && &サブルーチン(...);
この場合は
if(条件){&サブルーチン;}
とやるけど、それ以外はすべて同じ感じ。
状況によっては、ブロックの初期化のコストが気になります、、、
関数に対しては and or を使ってほしいなぁ。&&,||は値に対するものと誤解する。
>>701 言いたい事は分かるが微妙に突っ込まれそうな表現が嫌チック
「汚いソース」ってのは見たらわかるが、「綺麗なソース」の定義ってのは人によって違う気がする。 当然このスレの住人たちはおのおのの「綺麗さ」をめざしてコーディングしてるんだろうけど、 どんなことに気を使ってるのか熱烈に語ってたも。
できればコーディングスタイルについてはやらない方がいいと思う。水掛け論になって荒れるから。
アンチパターンぐらいありそうだけどPerl自体が(ry
メンテする人が見やくかけばいいんじゃないの? そのためのOOだしパッケージであるわけで・・・
先ず定義しなきゃならんのは Perl的か否かというこったな。
ファイルハンドルからファイル名を逆引き出来ますか?
709 :
デフォルトの名無しさん :03/05/05 05:24
Tieについて質問です。 配列やハッシュのタイ関数でSTOREとかFETCHとかいろいろありますが、 スカラーコンテキストで評価する際の挙動に該当するタイ関数ってあります?
710 :
デフォルトの名無しさん :03/05/05 07:15
>>709 perldoc perltie
perldoc Tie::Array
STORESIZEがそれにあたるかな。
Cもろくに扱えないのにPerlを始めるのはまずい?
>>713 Cを知らずにPerlをやるのは全然まずくない
が、一番初めにPerlに触るのはまずいかもしれない
>>714 そうなんだ…。そういえば記述の仕方が特殊ってどこかで聞いたことがあるような。
Perlを始める前に覚えておくと良い言語って何かあります?
暇な時にでも教えてくださると助かりますです。
717 :
デフォルトの名無しさん :03/05/05 15:02
Perlに、Cのプリプロセッサのような機能ってありますか?
>>716 Perlは変態的ですから、慣れると離れられなくなります。
>>716 記述の仕方が特殊というか、柔軟、冗長。
個人的に最初からPerlでもいいと思う。
冗長性が高いだけに、よいコードを書くために覚える事は多いけどね。
>>717 あると聞いたことがある。けど、多分、使うべきじゃない。
んー Perlを触る前に他のを覚える必要があるんじゃなくて
Perlのスタイルに染まる前に普通(?)のスタイルを身に着けた方が良いと思うんだ
その意味では
>>718 に同意
プログラミングの入門としては、Perlは受け入れやすい言語だとは思う
ただ、そのお気楽さ加減に染まりきってしまうと、他の言語を使うときに少々苦労するかもしれない
上記は、間違った方法でPerlを覚えた場合に当てはまる事で
真っ当にPerlを覚えるなら何も問題は無いよ
その辺に転がってる書き散らしのスクリプトとか、
目を覆いたくなるようなCGIのソースでPerlを覚えると、多分将来苦労する。
まずは、ラマ本、ラクダ本あたりで正当な(?)Perlを覚えるべし
# とかいいつつ、俺は汚いコードを書き散らしてるわけだが
>>720 けど、Cから入るくらいならPerlのがましと思わんか?
まあ、多数派に従えと言われたらそれまでだが。
らくだ本等のきれいなコードで覚えるべきってのは全く同意。
ラクダ本は高いから、初心者には手が出せないってのが本音。 で、巷に流れている汚いソースに汚染されるんだ罠。
まぁプログラムにお金かけたくないような趣味プログラマだったら 汚いコード書いても別にいいと思うけどな。
724 :
デフォルトの名無しさん :03/05/05 20:58
>>711 ハッシュの場合、STORESIZEにあたるタイ関数って無いみたいなんですけど、やっぱ無いの?
perldoc perltie
perldoc Tie::Hash
は見たけどないっぽい。
デフォルトでは「レコード数/バケット数」を返すみたいなんだけど、それを変更したいのです。
>>724 ああ、ハッシュは無いね。
多分、ハッシュをスカラーコンテキストで評価した値はデバッグ(ないし最適化)にしか使えないからでしょ。
TieHashの実装によってはレコードやバケットという概念は無意味だし、
本当に必要だとしても、tied(%h)->method()と呼び出すただのメソッドでいいんじゃない?
727 :
デフォルトの名無しさん :03/05/05 23:54
Perl6/Parrotの話はとんと聞かなくなっちゃったなぁ・・・ すげー楽しみにしてるのに。
728 :
デフォルトの名無しさん :03/05/05 23:58
質問させてください。 Perlccを使って、バイナリファイルを出力しようとしたのですが、 いろんなファイルが足りないらしく、エラーが出てコンパイルできませんでした・・・。 Perlだけをインストールしただけでは、perlccは使えないのでしょうか? Perlのバージョンは、5.8.0を使ってます。 OSはWin2kです。 よろしくお願いします。
perlccってPerlのソースをまずはC言語のソースにするものなんじゃない? Cのソースを吐くオプションがあるし。 だからCコンパイラが必要だと思う。
>>729 はい。Cソースを吐くオプションをつけて出力してみました。
・・・で、bcc32でコンパイルしようとしたら・・・
びっくりするほどエラーが出て、自分がわかる範囲で修正したのですが、
それでもエラーが出ます・・・
bcc32ではコンパイルできないのでしょうか・・・?
clコマンドを使ってる所を見ると、デフォルトではVC++のようですが・・・
>730 VS.Netでコンパイルしてみたら C:\test>perlcc test.pl cl : コマンド ライン warning D4002 : 不明なオプション '-nodefaultlib' を無視しま した。 cl : コマンド ライン warning D4002 : 不明なオプション '-debug' を無視しました。 cl : コマンド ライン warning D4002 : 不明なオプション '-libpath:C:\Perl\lib\CORE ' を無視しました。 cl : コマンド ライン warning D4002 : 不明なオプション '-machine:x86' を無視しま した。 pcc73hwa.c LINK : fatal error LNK1104: コンパイラは、ファイル 'pt:ref,icf.exe' を開くことが できません。 ってでて出来ませんでした。まあ一応報告…
VC++6.0ならリンクエラーだけだった。
バッチファイルを少し書き換えただけで通った。
環境は
>>728 と同じ
いろいろ、ググ〜ルさんにお伺いを立てた所・・・ やっぱ、Perlccで吐くCソースをコンパイルするのは難しいらしいです・・・ VC++がデフォルトらしく、コンパイルは通るが実行すると落ちるらしいです。 bcc32で、コンパイルを無理に通してできた実行ファイルも、ワトソン博士に怒られるらしいです。 素直にCで組み直します・・・ ありがとうございました。
わざわざ試してくれた人がいてるのですね。
ありがとうございます。
>>731 Vs.Netでは、コンパイル通らないんですね・・・。
結構あっちこっち書き換えないとコンパイル通らないらしいですよ。
>>732 その実行ファイル・・・
実行すると、落ちませんか?
>>735 そうですか。
俺の調べでは、VC++で出来た実行ファイルでも落ちるってありましたが・・・
古い記事だったので、Perlのバージョンアップで修正されたのかもしれませんね。
なんだか、ちょっと望みが出てきました。
俺も、bcc32でコンパイルできるよう、もうちょっとがんばってみます。
Windowsってのがビックリなわけだが
初めてのPerl 第3版っていうのが5月15日にでるようですが これがらくだ本ってヤツですか?
742 :
デフォルトの名無しさん :03/05/06 21:45
print "$kazu"; で数値を出力するとき、マイナスだと自動で -30.5 とか出力されるけど プラスのとき自動で +30.5 と出力することは出来ますか? 自分で0以上か調べて+を先に出力するしかないですか?
743 :
デフォルトの名無しさん :03/05/06 22:23
>>742 printf('%+d', 30);
printf('%+d', -30);
744 :
デフォルトの名無しさん :03/05/06 22:29
Perlのセキュリティホールを勉強できるホームページってありませんか? 一応探したのだがなかなかいいのがなくて。 あとたとえば掲示板作るとき、セキュリティホールって考慮するの?するか・・・ アクセスカウンターはしなくていいよね?そりゃそうか・・・
WebProg逝け
746 :
デフォルトの名無しさん :03/05/06 22:34
747 :
デフォルトの名無しさん :03/05/06 22:43
>>744 掲示板作る時、自らのプログラムの欠陥は当然のごとく考慮するよ。
perlのセキュリティーホールは、そんなもん考えてなんになるの?
ってか、プログラム自体にセキュリティは必要ないのでホールとやらもありません。
748 :
デフォルトの名無しさん :03/05/06 22:50
749 :
デフォルトの名無しさん :03/05/06 22:55
>>748 いやどっかのサイトにセキュリティホールがこれこれしかしかと書いてあったので。
心配で、CGI作れねぇって思っていたところです。
なんかCGIからメール送信するときに危ないとかなんとか・・・・。
ってかないの?ホームページと違って訳分からん。吊って来ます
750 :
デフォルトの名無しさん :03/05/06 22:57
>>749 それ通信のセキュリティーじゃねえの?
取り敢えずCGIとperlをごっちゃにするな。
あ、もしかしたら文字化け事件かな?
大丈夫。多分キミはそんな事気にするようなレベルじゃないと思う。
>744 $buf = $ENV{QUERY_STRING} open("$buf.dat") とかしてたとするとき count.cgi?hoge%0|cat%20hogehoge とか書かれたら
752 :
デフォルトの名無しさん :03/05/06 22:59
hahaha、そりゃそうだその通り。これでPERLが勉強できます。 サンクスコンタンボンバー焼肉
753 :
デフォルトの名無しさん :03/05/06 23:01
>>751 そんなスクリプト書くこと自体がアレなんだけどな・・・
cgiの穴であれば、Javascriptやeval、systemが問題だのぉ・・・
XSSでぐぐって見ればいいんじゃない?
まぁ本人が誤爆って言ってるのにレスつけるな、と。
756 :
デフォルトの名無しさん :03/05/06 23:08
マイナスの値もとる四捨五入はどうすればいいの?
758 :
デフォルトの名無しさん :03/05/06 23:14
岩下志麻 森山良子 小宮山洋子(53) 小渕優子(28) 華道家元の安達瞳子(高1まで)大島智子(42) 原かおり(39) 岩本さつき(37)山形テレビ 三上智恵(37)MBS 加藤ゆずか(36)岩手放送 山崎温子静岡第1TV椎名桜子(35) 上野ゆい(35) 水原恵理(35)テレ東 児島未散(34)宝田明の子 樫本(黒田)知永子 ×岩崎宏美・良美栗原はるみ(短大) 花田美恵子(若乃花夫人) 雨宮塔子(31) ドラ永井美奈子(36) 鈴木保奈美(35)鶴田真由(31) 宇都理恵(30) 藤村さおり28歳フジテレビ 中村奈央子(28) 伊藤裕子(27) 木村佳乃(25)山口もえ(24) 矢口倫子(24) 松藤あつこ(20) 峠恵子松田麻未 細田阿也(19)寺田はるひ(AV) 加藤一郎(初等学校から旧制高校成城学園→東京帝国大学法学部・ 元東大総長・東大名誉教授・成城学園名誉園長) 柳谷謙介(旧制高校→東大法学部・元外務官僚・成城学園理事長) 鯵坂二夫(旧制高校→京大・京大名誉教授) 小尾信弥(中学校から旧制高校まで成城学園→東京帝国大学理学部・ 東大名誉教授) 吉田秀和(旧制高校→東大フランス文学・音楽評論) 小澤征爾(中学校から高校1年まで成城学園、音楽を志し桐朋学園へ・ 指揮者・成城学園理事) 堤 清二(旧制高校→東大経済学部・実業家・ペンネ−ム‘辻井 喬’ 作家・成城学園理事) 羽田 孜(成城学園高校→成城大学経済学部・元首相・成城学園理事) 大岡昇平(青山学院中学から成城学園中学へ移り旧制高校→京大 フランス文学・作家) 大林宣彦 辻仁成 徳大寺有恒 黒沢久雄・優 赤木圭一郎 田村亮(55)・田村正和(58)丹羽義隆(46)松澤一之(46) 金田賢一 高嶋政宏 高嶋政伸 石黒賢(35) 田邊晋太郎 篠原俊晴 小倉淳 安藤弘樹 なべやかん 小坂一也(66) 及川光博 小宮山雄飛(ホフ・デュラン) 松尾雄治(高校まで)
759 :
デフォルトの名無しさん :03/05/06 23:20
>>256-257 いや、違うだろ。
if($aaa < 0){$aaa = int($aaa - 0.5)}
else{$aaa = int($aaa + 0.5)}
こうじゃないのか?
760 :
デフォルトの名無しさん :03/05/06 23:21
↑ん? 負の数の四捨五入の意味を間違えてたらごめんなさい。 いいんだよな?これで。
p d f な ん か 開 き た く な い
まずはマイナスの値もとる四捨五入の結果を定義しろ
764 :
デフォルトの名無しさん :03/05/07 04:48
>>763 普通四捨五入って言ったらどうなりますか?
0を起点に絶対値で四捨五入して、符号を戻すことでしょうか?
765 :
デフォルトの名無しさん :03/05/07 04:51
>>681 これわかる人居ませんか?
こまったなぁ
766 :
デフォルトの名無しさん :03/05/07 06:26
>>764 負の数の場合、絶対値を5社6乳して符号を戻すといいのではないかと思います
768 :
デフォルトの名無しさん :03/05/07 13:06
質問させてもらいます。 use関数で呼び出したモジュールは、一度呼び出すと、それ以上呼び出さないとありますが、 違うパッケージ内で、同じモジュールを呼び出しルーチンを輸入した時、 それは、2度呼び出されてる事になってるのでしょうか? そうなると、やっぱり処理速度に影響してくるのでしょうか?
遅くなってしまいましたがレスして頂いた方々、ありがとうございました。 無駄の無いきれいなコードを目指して頑張ります。 #理由はよく分からないけど正規表現にはまってしまった。
use strict って、チェックする時にだけ付けて チェックが終わったらコメントアウトしておくべき?
771 :
動画直リン :03/05/07 13:13
>>769 頑張れ、Perlは楽しいぞ
慣れて来たらぐちゃぐちゃなコード書くのも楽しい
# と悪の道へ誘ってみるテスト
>>770 なんで?
774 :
デフォルトの名無しさん :03/05/07 14:37
775 :
デフォルトの名無しさん :03/05/07 16:42
こんなふうに記述できたら見やすいソースになるんですが、何か方法はないでしょうか? あるいは、こういうふうに記述できる言語とか、プリプロセッサとか @a = ( 目玉 手足 はらわた ); print $a[0]; >目玉
qw
@a = qw( 目玉 手足 はらわた ); print $a[0];
う〜ん・・・? @a = ( "目玉", "手足", "はらわた", ); ↑これじゃダメなの??? 俺は、qwは嫌いな人なので、あまり使わない。
>>779 いや、別にダブルクォーテーションとコンマくらい、そんなに手間じゃないし。
削除も、一行削除で簡単だし。
Perlだけなら、なんて違和感ないんだろうけど・・・
他の言語とかもしてると、qwでの配列は違和感ある・・・
他の言語してるけど、違和感ぜんぜんなし。
@a = qw( don't "Hey!" ); 単にダブルクオーテーションとコンマが無いってわけじゃない。
>>781 最大の違和感は、スペースで区切るって所。
何か間違ってる気がする。
>>782 そんな時は、シングルクォーテーション使います。
とにかく、俺は違和感あるから嫌いってだけの話で・・・
こんな話でスレが伸びていくのも違和感ある。
と、言うことで、次回からいままで通り質問どぞ。
>>783 スペース? あぁ、空白文字の事かい
シングルクォートじゃ don't ダメだろ
混在させる? そりゃすっきりして気持ちがいいねぇ
気分でケチつける前に構文上の理由考えような
>>784 もういいって・・・しぶといな。
俺が違和感あって、それで嫌ってるだけだって。
無理に、qwを使うなって推奨してる訳じゃないし、
ただ、そう思うって言ってるだけで、qw使ってるヤツにケチつけるつもりもない。
俺は、qwが嫌い。それだけ。
786 :
デフォルトの名無しさん :03/05/07 22:31
useとrequireの違いって、importルーチンを呼び出すか呼び出さないかの違いだけですよね?
787 :
デフォルトの名無しさん :03/05/07 22:42
とぉむとぅだいをひていするものはPerlerにあらず。
てめぇで話し壊しといてもうお終いとは都合のいい話だな
>>786 if($hoge){ use "hogehoge"; }
if($hoge{ require "hogehoge"; }
なんてしたときに、useはどんな時でも読み込まれる
requireが、実行中にrequire文にたどり着いたら評価されるのに対して
useはとりあえず一番最初に処理されるはず
useにしとけば、実行途中にエラー吐くことは無い(最初にチェックされるから)
use でimport呼び出さない方法もあったよね、なんだっけ
use module (); だったかな。
790 :
デフォルトの名無しさん :03/05/07 22:55
>>788 あ、そんな違いもあったんですか。
所でちょっと長くなるんですが・・・
# ------------------------------------------------------------
[ test.pl ]
use strict;
use Test2;
print test->msg. "\n";
print test->number. "\n";
print test->change("こんにちわ世界2","")->msg. "\n";
print test->change("", "その2")->number. "\n";
exit (0);
↓つづく
>788 んじゃ、 if($hoge{ require "hogehoge"; } elsif($hage{ require "hagehage"; } elsif($hige{ require "higehige"; } こんな場合はrequireの方が負荷少ないかもしれないって事ですか?
792 :
デフォルトの名無しさん :03/05/07 22:56
# ------------------------------------------------------------ [ Test2.pm ] package Test; use strict; sub new { my $class = shift; my $data = { msg => "こんにちわ世界", number => "その1", }; bless $data, $class; } sub ::test { return Test->new() }; sub change { my $pkg = shift; my $new_msg = shift; my $new_number = shift; if ($new_msg) { $pkg->{msg} = $new_msg; } if ($new_number) { $pkg->{number} = $new_number; } return $pkg; } sub msg { return $_[0]->{msg}; } sub number { return $_[0]->{number}; } 1; # ------------------------------------------------------------ 上記のスクリプトで[test.pl]のTest2.pmをuseで呼び出すとうまく動くのですが、 requireで呼び出すと、エラーがでます・・・ これは、なぜなのでしょうか? ちなみに、上記のソースは見やすいようにタブ部分に全角スペースを入れてます。
>790,>792 割り込んでスマン =■●_
>>793 ぜんぜんOK。
requireとuseって、ラクダ本にもimportルーチンを呼び出すか呼び出さないかの違いって書いてあったような・・・
>>790 print test()->msg. "\n";にすれば桶。
requireは実行時に評価されるから、
testがサブルーチンじゃなくてパッケージ名だと思われてるっぽ。
796 :
790&792 :03/05/07 23:12
>>795 なるほど!
エラー出ずにちゃんと動きました!
勉強になりました。 ありがとうございます。
>>789 それこそ慣用的には
use module qw();
だね
Exporterですべでのシンボルをエクスポートするには、 どうやって記述すればいいでしょ?
すみません・・・
どなたか、
>>768 の質問をお答えできる人いませんか・・・?
よろしくお願いします。
なんか、Proxy規制で書き込めない人多発してるのかな? カキコ少ないね。
>>799 気にしなくていいよ。どうしても気になるなら自分でベンチマークとって見ればいい。
あと、ラクダ本は少々値は張るが買う価値はあると思うよ。
unix板の正規表現スレから誘導されました。 -----test.dat----- 木立(こだち)のなかに(夏目弱石) 山の上の芋粥(いもがゆ)(芥川蛇の介) ---------------- 上のデータから最後の括弧から括弧までを取り除きたいです。 括弧はずべて全角です。 while(<>) { chomp; s/(.+?)$//; print "$_\n"; } ですとうまくいきません。s/\Q(\E.+?\Q)\E$//;もだめですた。 perl5.6で、文字コードはeucです。 よろしくお願いします。
s/([^)]+)$//;
>802 上手くいかない、の意味を明確にしろ。 どういう結果を望んで、どういう結果になってしまったかをきちんと説明しる。 WebProg板のやりとりでそれくらい学ばなかったのか。
806 :
デフォルトの名無しさん :03/05/08 14:14
>>802 ソースと変換しようとしてるテキストの文字コードが違ってました。
・・・で、問題解決なら、核発動。
>>805 ●どういう結果を望んで:
-----test.dat-----
木立(こだち)のなかに(夏目弱石)
山の上の芋粥(いもがゆ)(芥川蛇の介)
----------------
上のデータから最後の括弧から括弧までを取り除きたいです。
●どういう結果になってしまったか:
まったくマッチせず、出力がない。
ところで、unix板の正規表現スレで解決しつつあります。
お騒がせしてすみませんでした。
>>802 初心者ぽいから、perl5.6じゃなく、jperlを使う。
>まったくマッチせず、出力がない。 おかしいな おれんとこでは 木立 山の上の芋粥 という結果が返ってきたが
>>807 誘導された後に質問繰り返してんじゃねーよ(´д`;)
そんな訳で、俺は
>>807 に振り回された訳だが・・・
s/.(*((.*))*.*)(.+)$/$1/; これでどうだ?
ちょっと失敗。 s/(.*((.*))*.*)(.+)$/$1/;
s/(((?:(?!)).)*))\s*$/$1/; こーだろうが・・・
>>812 これでも行けました。
unix板の正規表現スレで教えてもらった
s/(.+)(.+)$//;
でも行けました。最初、最長一致だからだめかと思ったけど。
3つの板・スレでお世話になりました。m(__)m
あ、あれまたお助けが・・・
>>813 あれ、これだと、削除したい著者名だけが残っちゃう。寝た?
著作者を残したいんじゃないの?? カッコからカッコつーから・・・
じゃ、コレでいけるでそ s/((?:(?!)).)*)\s*$//;
>807 >まったくマッチせず、出力がない。 だとしたら、正規表現の問題じゃないな。 >802のソースでなら、例えマッチがなくても「変換されないままの原文」が出力されるはずだ。 test.datの読み込みが失敗してるんじゃないか?
>>814 すまソ。s/(.+)(.+)$/$1/;ですた。
なんだか知らんがマルチポストらしいので無視でOK?
>>817 ああ、間違えました。「変換されないままの原文」が出力
されるのでした。すみません。
でも、「最短一致はマッチングの位置を後ろにずらしてくれない」
ということが分からないのは同じですが。
>>819 Perl初心者スレでは解決しないので断った上でunix板の正規表現スレに
行ったんですよ。そしたら、Perlの問題なので、このスレがいいと言わ
れたんですよ。その内、いろんなところでレスが付き始めて、とっくに
解決しているんですが、礼儀だと思って、お礼を言ったり、レスしてる
んです。では、もう書きません。
>>819 もうちょい状況嫁
で、動いたか報告が欲しいわけだが・・・
>>821 ・・・結果、マルチポストになってるだろ。
そんな、スネられたような反応されてもねー・・・
_, ._
( ゚ Д゚)
と二\/ |Vつ
\/) .|V
>>822 >>814 で書いたんですが。
おれいを書かなかったからいけないのかな。ありがとうございました〜。
unix板は過疎だからな 突然の初心者の来訪に扱い方がわからなかったんだろう まあ、許してやれや そして何事もなかったかのように次の質問をどうぞ↓
とりあえずのスクリプトだと @a = `ls` とか @b = `cat hgoe` を多用しちゃうんですが、邪道ですか? 後々使うようなら Dirhandle とか openでちゃんと書くんだけど。 と、毒にも薬にもならない話題を振ってみる
使い捨てスクリプトなら楽でいいじゃない?
>>826 もともとそういう言語。
がちがちに書くやつはcgiから入った口だと思う。
やっつけだと(やっつけでも?) @a = IO::File->new($hoge)->getlines() だなぁ。
シェルスクリプト書いたことある香具師なら 使い捨てPerlはバッククォートを多用するんじゃないだろうか。
複数のOSを渡り歩いていると外部のプログラムはあんあまり呼び出したくない。
832 :
デフォルトの名無しさん :03/05/09 12:06
Win版でファイル隠し属性はどうやって調べるの? UNIXにない機能だからWinでも実装されてないとか・・・
use Win32::File;
こうやるんだね。ありがと! Win32::File::GetAttributes(ファイル名, 戻り値); こうもモジュールが増えてくると本無しでは苦しいなぁ。
>>834 どういう意味かわからんけど、CPAN網羅してる本はないと思うよw
紙代だけでン十万行きそうだな(笑
CGI&Perlブラックブック売り切れ。 鬱
>>835 Perl使いではないんで、どういうモジュールがあるかよく知らなくて
ほとんど自作してたもんで。(特にCGIとネットワーク周り)
せめて、一覧と概要くらい把握しとかないと無駄な労力になるなぁと思って。
なんでみんな弱者に厳しいのに 最弱者である自分には甘いの?
Perl についての質問をしてください。
>>841 さんくす。でも、探してるのとはちと違うかなぁ・・・
「FTPはこれ、ODBCはこれ、使い方は自分で調べてね」くらいでいいんだ。
あと、CPANでなくても jcode.pl cgi-lib.pl gif-cat.pl みたいなのとか。
まぁ、普段perl使わない人間なんで もちっと勉強してきます。
そう言われてみりゃ数が多すぎるってのも考えもんだな
誰かが調査してまとめればいいんだ。 お、おれはやらねーぞ
845 :
デフォルトの名無しさん :03/05/09 19:21
じゃあ俺等で作るか。
まずは >845 からどーぞ。
CPANの日本語サイトってないの? httpでHTMLで普通にダウンロード。みたいな。
>>842 >FTPはこれ、ODBCはこれ、使い方は自分で調べてね
言っていることがわからない。
cpan searchで、ftp, odbcで検索するのと何が違う?
おれはむしろ使い方つーか、各モジュールの相互関係がよくわからないことがある。
でも、それを解説しようとするとxml本みたいに結局本の分量になっちゃうんでないの?
>>849 でもさ、CPANでFTP探すと大量に出て来るぜ?
ODBCもそう(ついでにDBI知らなきゃ、リスト大量に出ても全く理解できんな)
そこからどれを使うかは、慣れとか経験が無いと辛いんじゃないかな
普通にFTPするなら Net::FTP
ODBC使いたいならDBD::ODBC WindowsならWin32::ODBC
みたいな、定番だけのリストがあった方が良いのかもしれないと俺は思う
そりゃ、いろんな人が作ってるからなぁ・・・ 何をもって定番つーのかも不明だったりするのも真理
yahooオークションみたいに評価くだすとか、、、、。 (大変良い) 迅速なバグとり、ありがとうございます。これからも、 このモジュール利用させていただきます(はぁと (最低) インターフェイス考えろ!!使いずらくて、しょうがねぇ!!糞が!!
初心者的質問で申し訳御座いませんが、ご教授下さい。 <IMG>タグで表示されているIMGファイルを削除する方法を教えて下さい。 ../2003/images/img.gif 宜しくお願いします。
>>852 モジュール紹介とサンプルコード寄稿システムみたいなもんかな?
コメント数/評価でソートすりゃ自然に定番が分かると
で、誰が作るの?
856 :
デフォルトの名無しさん :03/05/10 19:00
だけどさ、オブジェクト指向やるつったって、 安定Perl5.5系 開発Perl5.8系 将来Perl6系 で、ぜんぜん作法が違うんだもんな。
今だったら、Perl5.8も安定してるだろ(w
>>858 それ。俺も気になってたけどやっぱそうだったか。w
誰か5.6と5.8の違いを日本語で書いてあるページ知ってる?
今から検索かけてみるけど、すでに知ってる人いたら書いといて。
861 :
デフォルトの名無しさん :03/05/10 23:58
拘束演算子(=~)の働きがよく分からないので教えてください。 三項演算子を使ってパターンを切替えようとして、以下のようなコード を書きました。(1〜4は切替えて使用) -- $str = "aaa"; $zero = 0; $one = 1; $str =~ ($zero ? s/aaa/${zero}0/ : s/aaa/0/); #(1) $str =~ ($one ? s/aaa/${one}0/ : s/aaa/0/); #(2) $str =~ (0 ? s/aaa/${zero}0/ : s/aaa/0/); #(3) $str =~ (1 ? s/aaa/${one}0/ : s/aaa/0/); #(4) print $str; -- 結果、(3), (4)は期待通り置換が行われたのですが、 (1), (2)はダメでした。まずカッコの中を評価してその結果に 拘束演算子を適用するというようには解釈されないのでしょうか? あと、定数と変数で動作が違うのも納得いきません。
862 :
デフォルトの名無しさん :03/05/11 00:35
変数に文字が入ってるか、数字が入ってるか調べる 演算子とか関数とかありませんか?
↓訂正 変数に文字が入ってるか、数値が入ってるか調べる 演算子とか関数とかありませんか?
>>861-863 同一人物?
とりあえず、(1)と(2)は変数が文字列として解釈されているから
第一項(っていうのか?)が偽になることは無いと思うぜ
あと、定数と変数を云々する前に
Perlでの変数内の文字列と数値の扱い方に気をやってみると良いぞ
新しいレコード$csvをshohinq_master.csvの一番上の行に加える、というものなのですが、 open(shohin,"+>shohinq_master.csv"); flock(shohin,2); @shohin=<shohin>; unshift(@shohin,$csv); print shohin @shohin; close(shohin); flock(shohin,8); ・・だとうまくいきません。一番上の行が上書きされてしまうだけです。 flockをコメントアウトしても同じなので、flockは問題ないですよね? 下だとうまくいきます。 open(shohin,"<shohinq_master.csv"); @shohin=<shohin>; close(rank); unshift(@shohin,$csv); open(shohin,">shohinq_master.csv"); print shohin @shohin; close(shohin); なにがいけないのでしょうか?おねがいします。
(゜д゜)
しまった・・。 下の、close(rank); となってるのはclose(shohin);の間違えでした。とりあえず動いてましたが。 どなたかわかる方、解答お願いします。
便乗質問です open (FILEHANDLE, +<EXPR); open (FILEHANDLE, +>EXPR); はどう違うのでしょうか? 調べてみても両方とも「読み書き両用でopenする」としか書いてありませんでした
682とは別人です。 >とりあえず、(1)と(2)は変数が文字列として解釈されているから >第一項(っていうのか?)が偽になることは無いと思うぜ (1), (2)の結果は両方とも "aaa" がプリントされるので置換自体が行われ ません。もし、真になることが確定していても置換が行われていれば、 (1)は "00" , (2)は "10" がプリントされるはずですよね? (あと関係ないけど、文字列 "0" は偽と評価されるはずなので(1)は "0" が プリントされる事を期待してます)
>>866 >>869 "+>"は、最初にファイルを空にする。よって、
>>866 は "+>" でなく、
"+<"を使うべき。
>>You can put a '+' in front of the '>' or '<' to indicate that you
>> want both read and write access to the file; thus '+<' is almost always preferred for read/write
>> updates--the '+>' mode would clobber the file first.
>>870 普通はこうじゃない?これなら $one でもうまくいくと思う
$zero ? $str =~ s/aaa/${zero}0/ : $str =~ s/aaa/0/; #(1)
>871 >866にseekやtruncateを教えてはやらんのん?
>>872 今はそうしてます。ただ、演算子(=~)の評価の仕方がよく分からなかったので。
$str =~ ($zero ? s/aaa/${zero}0/ : s/aaa/0/); #(1)
1, $zeroを評価
2, カッコの値が s/aaa/0/ となる
3, $str =~ s/aaa/0/ を評価
って、順番で評価すると思ってたんだけど…
で、定数リテラルだとおそらく期待した通りになってるとおもう。
>874 $_ = "aaabbb"; $one = 'aaaccc'; $str = "aaa"; $str =~ ($one ? s/aaa/xx0/ : s/aaa/0/); print "$str $one $_<br>\n"; $_ = "aaabbb"; $one = 'aaaccc'; $str = "aaa"; $str =~ (1 ? s/aaa/xx0/ : s/aaa/0/); print "$str $one $_<br>\n"; この二つを実行してみれば、なんとなくわかると思われ。 あと、お前さんは681じゃなくて861だろ?
876 :
デフォルトの名無しさん :03/05/11 16:21
print でデフォルトの出力先をコンソールではなくファイル に変更することはできるのでしょうか? たとえば open (OUT, "x.txt") のようになっているときに print OUT "abc" ではなく print "abc" で、x.txt に出力されるようにしたいわけですが。
>876 select(OUT)とかだったような気がする
うまくいきました。ありがとうございます。
879 :
デフォルトの名無しさん :03/05/11 20:27
>871 >873 レスありがとうございました。 seekは、なんとなくピンと来るものがあって調べてみたら、わかりました。
880 :
デフォルトの名無しさん :03/05/11 22:38
名前 : デフォルト名無しさん 板 : プログラマー ↑のような書式で書かれたトファイルがあります。 これを:(全角)を区切り文字として デフォルト名無しさん,プログラマー, のような結果を得たいと思っております。 しかし、 でふぉると名無しさん , プログラマー , というような結果になってしまいます。 while (IN) { @array=split(/:/, $_); print "$array[1],"; } アドバイスお願いします。
何が問題なんじゃコラー!
あ、改行が入るってことか。取り敢えずchompしとけよ。
chomp($array[1]); とやればいいんですか、それとも $hoge=chomp($array[1]); とやるのでしょうか?Perlは2バイト文字でも大丈夫ですか?
末尾の文字の2バイト目が\nと同じだった場合のことを心配しているの? 心配ならEUC-JPを使えば。
テキストファイルの文字コードをEUCに 変換してからやればいいのか。 どうも
>末尾の文字の2バイト目が\nと同じだった場合のことを心配しているの? ハァ?
>>886 最後の文字が日本語で2バイト目が\nだったらchompした時切られるでしょ?
>>887 制御コードは文字集合のところに入らないんじゃないかな
JISでもSJISでもEUCでも。
\(0x5c)はSJISの2バイトに来るんで、SJISは氏ね、とおもう
>>889 そうなのか。サンクス
\nと同じ文字があったら一行読み込む時にいろいろと不都合なことがあるか。
一行読み込んだ時点で改行文字を削除すればいいのか。すんげぇー。 目から鱗。
893 :
デフォルトの名無しさん :03/05/11 23:31
jperl は perlcrt.dll が無いと動かないようですが 最新の active perl をインストールした状態で検索かけてみましたが 存在しません。 仮に(実際確認はしてないので)古い active perl には同梱されているとして、 古い active perl を使わないと jperl は使えないのか、それとも perlcrt.dll だけどこかからゲットできるのでしょうか?
894 :
デフォルトの名無しさん :03/05/11 23:36
なんで連想配列はハッシュという名に変更されたんでしょう? ハッシュはただの実装手段だと思うんですが・・・
>>894 associated array よりも hash の方が名前短いから
Perlのインタプリタって独自に開発してもいいの?
>>894 arrayと混同するから、って聞いたことあるけど。
898 :
デフォルトの名無しさん :03/05/12 01:39
900 :
デフォルトの名無しさん :03/05/12 08:01
900ゲット(´∀`)
>>899 マルチバイト対応のfgets()と普通のfgets()が別個に必要になってしまうってことだろう。
902 :
デフォルトの名無しさん :03/05/12 10:22
perlプログラムをCGIで動かしているんですが、 途中重い処理があり、httpdのタイムアウトにひっかかり、 再試行もしくはサーバエラーが発生してしまいます。 forkして重い処理を別ファイル、別pidで動かしたいのですが、 親プロセスが子プロセスの終了まで待ってしまい、 結局タイムアウトが発生して困っています。 if ( $pid = fork() ) { print "Location: $url\n\n"; exit; } else { system("./hoge.pl"); } 先生方何卒お力を・・・(’д’)
httpdがCGIのSTDOUTとかがクローズされるのを待ってんじゃないかな。 elseでSTDIN/STDOUT/STDOUTをまず閉じちゃえば?
>>902 fork()ではなくて、標準出力をクローズするってのはだめ?
905 :
デフォルトの名無しさん :03/05/12 10:47
>>903 >>902 有難うございました。
if ( $pid = fork() ) {
print "Location: $url\n\n";
exit;
} else {
close(STDOUT); #←修正点
system("./hoge.pl");
}
あっさり解決しました。
perlでディアブロにログインするスクリプト作ってください
ディアブロにログインするまでの手順(望むらくプロトコルの規格書)を出してください。
Perl/Tkはいいね 流行るといいなぁ
>>901 ああ、分かった。
>\nと同じ文字があったら一行読み込む時にいろいろと不都合なことがあるか。
の後に「だから、\nと同じ文字は無いんだな」ってのが省略されてるのか。了解
いや、仕様はPerlそのまんまで、実装だけ独自にってことだろ? 問題はないはずだが。
>>911 >
>>903 > この手、頂きます。
STDINは/dev/null、STDOUT,STDERRは同じくnullかファイルにリダイレクトし
た方がいいかもしれん。
使わないことが確実ならいいけど。
915 :
デフォルトの名無しさん :03/05/13 20:21
$ss = "S"; @aa = split(/\n/, << "eot"); 000 111 222 eot @aa2 = split(/\n/, << "eot"); aaa bbb ccc eot &getArray($ss,@aa,@aa2); sub getArray($@@) { my($s, @a, @a2) = @_; print $s."\n"; print $a[0]."\n"; print $a[1]."\n"; print $a2[0]."\n"; print $a2[1]."\n"; } 型宣言もしてるので、このままでも動いてくれていいようにも思うのですが、 これ、@a に @aa2 の中身も全部もっていかれてしまい、aaa, bbb とは表示されません。 サブルーチンで配列を正しく渡すにはどうしたらいいでしょうか? ポインタを使うのかな?
>>915 @は、後ろ全部を飲み込んじゃうよ
ポインタつか、リファレンスを使えばOK
&getArray($ss,\@aa,\@aa2);
sub getArray($@@) {
my($s, $a_ref,$a2_ref) = @_;
@a = @{$a_ref};
@a2 = @{$a2_ref};
ごめん、プロトタイプ宣言直すの忘れた
リファレンスで渡された配列の要素数って scalar関数使うのが一番手っ取りばやいですかね つまり、サブルーチン内で @array = (1, 2, 3, 4); $ref = \@array; print scalar(@$ref); 普通の配列みたいな $# で要素数を取れるような やり方はないでしょうか
>>918 print $#{$ref};
わかってると思うが、scalar(@array) と $#array の値は
1異なるので注意してな。
>>919 なるほど、そういうことか
1異なるのはわかっておりまつ、ありがとう
requireについて質問させて下さい。 requireって同一ファイルは一度しか読み込まないみたいなんだけど、 これを回避する方法無いですか? 複数のパッケージで、同じファイルをrequireする必要あるもんで、 オナガイシマス。
>921 requireするファイルの中身を丸ごとサブルーチンに入れて、 サブルーチンで呼び出せば?
do 'hogehoge.pl'; にすればいいのでは。
925 :
enter :03/05/14 09:45
すみません。日本語文字の扱いで、 問題が出てきたのでおしえてください。 ($str) = @ARGV; &jcode'convert(\$str,'euc'); $str = substr($str,0,50); このように、日本語(どのコードかは不定なので、 ECUに変換する)を50文字でカットして、 DBに追加しようとしているのですが、 追加の際に、たまに、EUCではないコードが発見 されたとして、エラーがでます。 エラーは↓のようなものです。 DBD::Pg::st execute failed: ERROR: Invalid EUC_JP character sequence found (0xbf00) おそらく、最後の文字が2バイトだったときに 半分にちぎれてしまっているのだと思います。 いろいろ試したのですが解決できません。 なにかよい方法はありませんでしょうか? 上記のエラーがでたときは、DBに文字が追加されないのですが、 強引に追加する方法でもかまいません。 環境 perl5.6.0 DB:postgresql OS:RedHatLinux7.2
926 :
デフォルトの名無しさん :03/05/14 10:01
>>925 DB 側で文字数の制限をかけるか、
マルチバイト文字の境界を正しく判定して文字を切りつめるかのどちらか。
後者については大崎さんの Perl メモとかが参考になるんじゃないかな。
927 :
enter :03/05/14 10:14
>>926 さん
ありがとうございます。db側では、例えばこのような場合、
varchar(51) のようにしています。
それより大きな長さの文字を入れようとしてもエラーがでるので
substrでカットしようとしたところでした。
大崎さんの Perl メモを参考にさせていただこうと思います。
s///で最後の文字を削除のようにしたらなってくれればいいのですが・・・
928 :
デフォルトの名無しさん :03/05/14 12:10
evalでエラートラップして、漢字の泣き別れでエラーが起きてるなら 最後の1byteを削ればいいんでは。
929 :
enter :03/05/14 12:21
>>928 さん
ありがとうございます。Perlメモのところに
最後がとぎれているかを調べる正規表現がありましたので、
そちらでしらべ、途切れていたら1byte削除というほうほうで、
回避することができました(^^
今回は1ファイルから1行ずつよみこみ、変換し、変数に追加し、
DBにいれるという状況なのですが、
1行ずつ処理しているときに、たまに変換がうまくいかないという
こともあるようでした。それも、できるだけ対応しました。
今は、なぜが、chomp や s/\s//g をやっても
削除されない改行コードをどうやって削除するかに
苦戦しています。
s/\r\n//g じゃだめかい? s/\r\n$// でもいいけど 一度、文字コードと改行コードをまともに調べた方が後の苦労が無いと思うよ
931 :
enter :03/05/14 13:06
>930さん どうもありがとうございます。 どうやら、読み込んだファイルの中に\nという記述があり、 それが悪さをしていたようでした。 なので、s/\\n/gとして取り除くことで、それは 削除できました。 次は、perl実行中にsegmentation faultが起こる理由がわからず 苦戦中です。 必ず同じところで発生するので、何らかの理由があると 思うのですが・・
一つよろしいでしょうか? 先頭が「-」ハイフンから始まるメールアドレスに、どうしてもメールが送信できません。 メールアドレスを直接、UNIXのmailコマンドに送ってメール送信をしていますが、 コマンドを起動する前に、 $mailaddr = qq|”\\\\\\\\|.$mailaddr.”\”” if ($mailaddr =~ /^\-/); と処理しています。(もちろん上記の全角部分も半角で記述しています。) 上の方法じゃだめなんでしょうか? (というか、「-」から始まるメアド、DoCoMoとか野放しなのがいけないんだぁ!!^^;)
932です。 ちなみに、¥の数は合っているはず。^^;;
というか、「-」で始まるアドレスは RFC 的に許されているはず。なんでも DoCoMo のせいにすんな。
>>934 (´-`).。oO(なぜ、docomoの肩持つんだろ・・・社員?)
936 :
enter :03/05/14 15:03
segmentation fault の原因なのですが、 @FIND = `/usr/bin/find ./$directory -type -f`; のところで出ていました。 しかし、いろいろなディレクトリにおいて実行するのですが、 特定のディレクトリのときのみです。 その中身は10くらいのファイルがあるだけで、 変な文字があるというわけでもありません。 テストスクリプトにその部分だけかけば記述されるし、 苦戦しています
gdbでcoreを調べr
938 :
enter :03/05/14 15:26
すみません、gdbは perlにも対応しているのでしょうか? gpc ./Main.pl としてもエラーがでます。 普通に実行したときにコアファイルもはきだしません。
分からないなら無理しない。
940 :
enter :03/05/14 16:10
ある、特定のファイルのオープンに失敗しているようです。 しかし、普通にオープンしているだけだし、 s-jisで読み込んでeucに変換しますし、 ファイルサイズが大きいわけでもないし・・
EUCってさぁ [EUC始まり]■○□△[EUC終わり] みたいにはじめと終わりに制御コードが付いてるんじゃなかったっけ? だとしたら途中で切っちゃっていいの?
932です。 解決しました。有難うございます。 「”」で囲わなかったらうまくいきました。 って、簡単すぎるよ・・・。_| ̄|○
>>938 > gpc ./Main.pl
> としてもエラーがでます。
gpc: command not found か?
segmentation faultが起きるってのはperl自体のバグ。
gdbの使い方は
$ gdb /usr/bin/perl core
だが、デバッグオプションつけてコンパイルいてないと無理だろうし、ソース
もないとダメだから、自分でコンパイルし直すのが確実。
>942 うわ〜ん
>>936 segmentation faultの原因はわからないが、find程度のことなら自前でやれば問題はないと思う。
標準ライブラリのFile::Findと付属のユーティリティfind2perlを参照のこと。
947 :
デフォルトの名無しさん :03/05/15 09:55
今
>>925 と同じことをしててPerlメモを参考にしてるのですが、
うまくいきません。
#$strの最後の文字が途切れているか判定する
if($str=~/\x8F$/ || $str=~tr/\x8E\xA1-\xFE// % 2)
{
chop($str);
}
これってもしかしたら半角カナが入ってた場合は思うような結果は得られませんか?
plの1行目を以前は #!/usr/bin/perl で動いていたのですが、なぜか、今は bash: ./Main.pl: bad interpreter: No such file or directory というエラーが出て動きません。 #!/usr/bin/perl -w など、何らかのオプションをつけると動くのですが、 これではすこしまずです。 なぜ、こうなるのでしょうか?
949 :
デフォルトの名無しさん :03/05/15 11:44
>>948 俺は以前、ソースをWinで編集してUnixのサーバーに転送って形で
作業をしてたら、改行コードのせいで同じような問題がでたことあるよ。
>>949 どうもです。
ですよね・・バイナリモードとか気にして送らないとだめな
ばあいですね。
でも、今回は、サーバー上で編集してるんです。
EUCできっちりしてるし、
消して書き直したりもしたけど、やっぱり無理。
なんでだろう・・
head ./Main.pl | cat -v すると ^Mがでてこない?
あれ! #!/usr/bin/perl^M ^M が出てきます。どうしてでしょう? これだからならないんですね・・・
>>950 EUC は文字コードの話。改行とは関係ナッシング。
ソースはリモートホスト上でスクラッチしたのならわからないが、
ローカルホスト上で書いた改行コードがアレなファイルをリモート上で編集しても
改行コードはアレのままだYO!
安直な方法
nkf --unix < kusatta_kaigyo_code_no_text > matomona_kaigyo_code_no_text
>>951 さん
>>953 さん、
まさに適切なアドバイスをありがとうございました。
文字コードと改行コードは別だったのですね・・
知りませんでした。
ありがとうございました。
955 :
bloom :03/05/15 15:13
956 :
デフォルトの名無しさん :03/05/15 19:11
perl5.8の場合、 元の文字コードがわからないものを eucに変換することはできないのでしょうか?
957 :
デフォルトの名無しさん :03/05/15 19:24
.qmailやaliasesからperlでメールを受信しています。 ただ添付ファイルがあるメールやHTMLメールを受信した場合に 処理が変になってしまいます。 このあたりの処理をやってくれるモジュール類でおすすめのものがありましたら教えてください。
958 :
デフォルトの名無しさん :03/05/15 19:31
参考になるページだけでも良いので、 もしご存じでしたら教えてください。 Googleで色々探してみたのですが、良いページがなかなか無くて。
perlからpostgresqlに、データを入れるのですが、 たまに↓のようなエラーが出ます。 DBD::Pg::st execute failed: ERROR: Invalid EUC_JP character sequence found (0xaa04) at .//db.pl line 89. 0xaa04という文字コードをふくんでいるからだと思われますが、 できるだけEUCのみを追加するようにしています。 動きとしては ファイルを開く ↓ 1行ずつ読み込む ↓ Perlメモのソースを組み込み、 できるだけEUCにし、それでも EUCじゃなさそうなものは無視する EUCのものは変数に追加していく ↓ ファイルを読み終わったら、 変数をDBに追加する。 ということをしています。 これで100件に1回くらい上記のエラーがでてしまいます。 どうにかして、避けたいのですが・・・
961 :
デフォルトの名無しさん :03/05/15 20:19
>>960 > EUCじゃなさそうなものは無視する
これが不完全なんだろうな。
962 :
デフォルトの名無しさん :03/05/15 21:25
こちらは、Active PerlのWin32環境です。 Perlで、特定のディレクトリ以下のファイルをミラーリングして、ファイル を更新(古いファイルは退避)した時、ファイルを上書きする時などに、 ログに残すスクリプトを書いているのですが、日本語のディレクトリ名 が入るとどうにもうまくいきません。 「〜〜表」みたいな名前のディレクトリがあると、'コードの\'(0x5C)が ディレクトリの区切りと混同されるらしく、ファイルテスト判断子(-d)で 判定しても、ディレクトリと思って貰えないようです。 この問題を解決する手段をご存知の方、お教えください。
ちと質問でつ #!/usr/bin/perl -T って意味あるの?
よくわかんないやつはjperl使いなよ
966 :
デフォルトの名無しさん :03/05/15 22:29
aaggee
>>962 読んだファイル一覧を、jcodeとかでEUCに変えれば?
半角カタカナは全角に戻して。
>>967 EUC-JPに直すんなら半カナ→全カナはいらないと思うが。
>>964 >>967 お返事ありがとう。
それやったんですが、やっぱり、ファイルテスト判断子が通らないん
ですよねぇ。ファイルテストって内部的にどういう処理になってるのか?
知らないのですが。どうもそれじゃダメみたいです。
Jperlって手もあるんだけど、今、いろいろモジュールが入っているの
で、あの環境を残しておきたいんですよねぇ…
970 :
デフォルトの名無しさん :03/05/16 01:21
jperlは駄目。 次のスクリプトを試してみな。 これで駄目なものが出るようなら、Visual C++のisDirectory関数を使った ライブラリを必要な人が自分で書くしかないな。 opendir DIR,'.'; @files = readdir DIR; closedir DIR; for (@files) { print $_; s/\\$/\\\\/g; print " -> Directory" if (-d) ; print "\n"; }
971 :
デフォルトの名無しさん :03/05/16 01:22
おっと、gは余計だった、スマソ
Windows2003のIIS6でActivePerl5.8でのCGI 動いた人いる? なんか動かないんだが、、
誰か五箱目作ってくれ。
perlって、ソート標準にソート関数がありますよね。 で、ちょっと使いかたを把握してないのですが、以下の処理は可能でしょうか? また、可能ならばどう記述すれば良いでしょうか? @aaa; #整数が複数個入っている。 @bbb; #整数が複数個入っている。 これをまぜて数字順でソートしたい。@sortの中にいれる。 ただ、数字を入れたいのではなく、「aaa」の文字列か「bbb」の文字列をいれたい。 もうちょっと分かりやすく言うと、 @aaa = (12 , 1); @bbb = (5, 3); となっていたとする。 この場合、最大値と最低値の数字をaaaが持っていて、中の二つの数値はbbbが持っているので、結果的に @sort = ('aaa' , 'bbb' , 'bbb', 'aaa'); となるようにしたい。実際の所は、@aaa、@bbb共に何個数字を持っているか分からず、ダブっている数字もある。(ダブっていても抹消されないようにしたい) 数字は、大きいほうからの順で先頭から代入させたい。
訂正 >perlって、ソート標準にソート関数がありますよね。 perlって標準関数にソートがありますよね。 テンパってました。
976 :
bloom :03/05/16 03:13
すみません。 標準関数を使わないで自分で作り始めたのですが、なんとか自己解決できそうです。 すみませんでした。
push(@bbb, @aaa); @sort = sort{ $a <=> $b } @bbb; でいいのか?
>>979 質問者の俺が言うのもなんですが、明らかに違うっす。
記述のほうは自作でループ作って解決しました。
順番に照合していって、@sortにaaaかbbbの文字列を代入させる方法です。
マージソートじゃ駄目なの?
>>981 @sort = map { $_->[0] }
sort { $a->[1] <=> $b->[1] }
(map { ['aaa', $_] } @aaa),
(map { ['bbb', $_] } @bbb);
>>982 ソートアルゴリズムを選んでどうなるものではない。
正解は983だろう。
combsortって速いソートなんですか?
>>961 さん
そうなんです。
これが晩年の問題なんですよね・・・
>>983 よ、よく分からんけど。美しい!
え〜と、リファレンスがmapで…?
……ボ〜ン!!
ひ、久しぶりに本開いてみよう…汗
ありがとうございます。
ちゃんと理解してから使わせてもらいます。
>>989 クックブックに解説載ってるよ、シュワルツ変換だったかな
俺も感動した
むしろEffectivePerlやな。