Perlについての質問箱 18箱目
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2005/07/20(水) 05:15:36"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
● 2005/03/17現在の最新版: 5.8.7
● 2005/03/17現在の開発版: 5.9.2
0159デフォルトの名無しさん
2005/08/03(水) 00:39:420160デフォルトの名無しさん
2005/08/03(水) 00:51:42PGIDしらべてプロセスグループを殺すとか、
調べるのめんどくさければ他のも巻き添え
食うの覚悟でkill -1という手もある。
0161デフォルトの名無しさん
2005/08/03(水) 01:03:22>kill -1
ドラえもんが、ネズミを駆除するのに「地球破壊ばくだん」を使おうとした話を
思い出したw いや確かに、繁殖力の強いネスミを絶滅させるにはそれしかないん
だろうけどw
0162デフォルトの名無しさん
2005/08/03(水) 01:05:04じゃあ、単純に
/var/www/hoge/hoge%hoge.jpg
というファイルがあって、それをブラウザで表示する
http://hoge.com/hoge%hoge.jpg
とやっても表示されない
ファイル名を hogehoge.jpgとして
http://hoge.com/hogehoge.jpg
とすると表示されます。。
なんででしょ?
0163デフォルトの名無しさん
2005/08/03(水) 01:11:42rfc1738
0164デフォルトの名無しさん
2005/08/03(水) 02:05:05サンクスコ
% → %25 で直りマスタ
0165デフォルトの名無しさん
2005/08/03(水) 02:07:47> じゃあ、単純に
> /var/www/hoge/hoge%hoge.jpg
>
> というファイルがあって、それをブラウザで表示する
> http://hoge.com/hoge%hoge.jpg
http://hoge.com/hoge%25hoge.jpg
でイクのかな?
っていうか、ブラウザのメッセージくらい見ろよ。
0166デフォルトの名無しさん
2005/08/03(水) 09:52:58HTTP_REFERERでパスが漏れるのが心配なんですが
他のサイトへのリンクを貼らなければ大丈夫ですか?
0167デフォルトの名無しさん
2005/08/03(水) 10:51:47&jcode'convert()
&jcode::convert()
(引数省略)
エディタの色分けがおかしくなってしまうので、「::」の形式に統一したいのですが
問題ないでしょうか?
0168デフォルトの名無しさん
2005/08/03(水) 11:02:52その糞エディタを(ry
他人のコードを読むにあたってエディタの都合で
コード改変というのは発想が間違っている。
そもそも質問にあるようなコードぐらい自分で検証できんのかと。
0169デフォルトの名無しさん
2005/08/03(水) 11:38:54> 地球破壊ばくだん
正確には「地球はかい爆弾」。
・・・恐ろしくどうでもいい指摘だなw
0170デフォルトの名無しさん
2005/08/03(水) 12:42:38perlmodによれば
古いパッケージ区切り子はシングルクォートでしたが、
現在はダブルコロンを使うのが推奨されています。
なぜなら、この方が人間が読みやすいということと、emacsで読みやすいからです。
これはまた、 C++プログラマーに自分が知っていることのように思わせるようにもします。
それは以前のシングルクォートがAdaプログラマに馴染みのものでであったことと同じです。
0171デフォルトの名無しさん
2005/08/03(水) 13:37:57>>170
レスありがとうございます。
コード改変についてはそれが許されている状況だったもので。
検証はしてみたのですが、違いが無かったので心配したわけです。
ありがとうございました。
0172デフォルトの名無しさん
2005/08/03(水) 14:11:46そのパスワードが漏れてもいいようなどうでもいいものならそれでいいんじゃね?
0173デフォルトの名無しさん
2005/08/03(水) 14:18:33168は許されている許されていないの問題ではなく、
エディタの都合でソースを弄るということが
決定的な間違いだと言っておると思うのだが。
0174デフォルトの名無しさん
2005/08/03(水) 14:37:37Perl4時代の古い習慣だし、直していいんじゃね?
コロン2つになった理由の一つもコレだし↓
>なぜなら、この方が人間が読みやすいということと、emacsで読みやすいからです。
~~~~~~
ついでに言うと、古い*.plライブラリを*.pmモジュールに変換する
pl2pmなるユーティリティがPerlディストリビューションに含まれている。
つまり、これは非常識でもなんでもない。
0175デフォルトの名無しさん
2005/08/03(水) 15:12:05仕事が遅くなるだけじゃねーかw
そんな考え、誰も評価しませんから〜。!残念!
0176デフォルトの名無しさん
2005/08/03(水) 16:59:120177デフォルトの名無しさん
2005/08/03(水) 17:32:190178デフォルトの名無しさん
2005/08/03(水) 21:25:280179デフォルトの名無しさん
2005/08/04(木) 13:20:27makeは成功したが、make testで
$ make test
PERL_DL_NONLAZY=1 /usr/local/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t
t/GD..........Can't load './blib/arch/auto/GD/GD.so' for module GD: dlopen: libgd.so: symbol "iconv_open"
unresolved at /usr/local/lib/perl5/5.8.0/alpha-dec_osf/DynaLoader.pm line 229.
at t/GD.t line 13
と出てテストが失敗してしまう
0180デフォルトの名無しさん
2005/08/04(木) 16:35:08cのgetprognameみたいなものってありますでしょうか?
$0を自分で整形するのが普通なんでしょうか?
0181デフォルトの名無しさん
2005/08/04(木) 18:17:33パールは、クライアントの入力情報を反映させて、
HTMLソースを生成できますが、
HTMLソースにパールを埋め込んで?(そのページが「○○○.cgi]ではなく「○○○.htm」の形で)
クライアント(HP閲覧者)の環境変数を取得することは可能でしょうか?
他に環境変数を取得できる方法とその言語、そのサーバーの環境を教えてください。
よろしくお願いします。
0182181
2005/08/04(木) 18:20:080183デフォルトの名無しさん
2005/08/04(木) 20:51:500184デフォルトの名無しさん
2005/08/04(木) 21:58:35WebProgへ行きなされ
0185デフォルトの名無しさん
2005/08/04(木) 22:03:43それが最近はあるんだな。オレはFreeBSDしか知らんが
HISTORY
These functions first appeared in NetBSD 1.6, and made their way into
FreeBSD 4.4.
だそうだ。
0186デフォルトの名無しさん
2005/08/04(木) 22:10:27それは C にあるとは言わん
0187デフォルトの名無しさん
2005/08/04(木) 22:19:13File::Basenameあたりは使えると思うけど、もっと
これ専用のものってなんかあるっけ?
0188デフォルトの名無しさん
2005/08/04(木) 23:20:24$0に代入するとperlの中の人がsetprogname()を呼んでいる。
0189デフォルトの名無しさん
2005/08/04(木) 23:22:380190デフォルトの名無しさん
2005/08/04(木) 23:22:55それならプログラム先頭で (my $__progname = $0) =~ s,.*/,,; で十分だろ。
Cのgetprogname()もやってることは同じだ。
0191デフォルトの名無しさん
2005/08/04(木) 23:23:140192デフォルトの名無しさん
2005/08/05(金) 11:08:49ありがとうございました。
FindBinってのもあるみたいです。
0193134
2005/08/05(金) 11:35:29そんなワザがあるのかぁ…勉強になります。
とりあえず今回は穏便に、毎回プロセスを終了するようにしますた。
カネ払ってしまったからリスクのあることは出来ないのでね…
0194デフォルトの名無しさん
2005/08/05(金) 12:40:57こういうログがあるときに、
perl -ne 'if(/from=<info@mail.[^>]+\.(com|net)>.*msgid=<[^>]+qmail@mail.*relay=\[([0-9]+(\.[0-9]+){3})]/) { print "$2\n" }' /var/log/syslog
だとマッチするのに
perl -ne 'if(/from=<info@mail\.[^>]+\.(com|net)>.*msgid=<[^>]+qmail@mail.*relay=\[([0-9]+(\.[0-9]+){3})]/) { print "$2\n" }' /var/log/syslog
だとマッチしないのはなぜですか?
0195デフォルトの名無しさん
2005/08/05(金) 13:31:48> そんなワザがあるのかぁ…勉強になります。
×ワザ
○ワナ
0196デフォルトの名無しさん
2005/08/05(金) 13:56:40@mailが展開されてたぶん空文字列になってるから。
0197デフォルトの名無しさん
2005/08/05(金) 16:50:54okay!
Thanks.
0198デフォルトの名無しさん
2005/08/05(金) 21:39:47Sendmailなんて化石のようはソフトを使ってるから
0199デフォルトの名無しさん
2005/08/05(金) 21:47:580200デフォルトの名無しさん
2005/08/05(金) 22:11:38え? SenderID とか Domainkeys とかの最新技術にまともに対応してんのって、
sendmail くらいしか無いじゃん。どこが化石よ。
0201デフォルトの名無しさん
2005/08/06(土) 03:31:49>>198をよく見ればわかるけど初心者を相手にしてどうする?
そのうち彼はperlのことも化石にしてしまうと思うぞ。
0202デフォルトの名無しさん
2005/08/06(土) 03:51:500203デフォルトの名無しさん
2005/08/06(土) 15:04:55ということをやらせたいのですが、sjisで書くと通りません
全角文字部分をヒアドキュメントにするにはどうすればいいですか
0204デフォルトの名無しさん
2005/08/06(土) 15:19:58ローマ数字の 9 は Shift_JIS だと \x87\x5C で、
http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm#errors
の「エラーにはならないけど文字化けする(1)」に相当する。
0205デフォルトの名無しさん
2005/08/06(土) 15:41:43use encoding "cp932";
0206デフォルトの名無しさん
2005/08/06(土) 17:43:44�\
EOF
s/$pat/IX/g;
のようにすると、
Trailing \ in regex m/�\/ at xxx
というエラーになります
chomp($pat = <<EOF);
�\
EOF
s/$pat/IX/g;
とすると、IXではなくIX\になります
よく判りません
0207デフォルトの名無しさん
2005/08/06(土) 18:00:06>>205
0208デフォルトの名無しさん
2005/08/06(土) 18:01:280209デフォルトの名無しさん
2005/08/06(土) 18:09:47ということですね
0210デフォルトの名無しさん
2005/08/06(土) 18:38:200211デフォルトの名無しさん
2005/08/06(土) 18:45:55ヒアドキュメントを使った方法は不可能です
0212デフォルトの名無しさん
2005/08/06(土) 18:47:493行目が嘘。
>>206
$pat の中身は \x87\x5C なので何の解決にもなっていない。
>>207
http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm#regexp
0213デフォルトの名無しさん
2005/08/06(土) 19:02:45ヒアドキュメントを使うことで回避できるけれど、
この場合はパターンマッチの中に使おうとしており、
どうせ文字列の評価が発生するので避けられない
何か方法がありそうな口ぶりの>>208や>>210は
ただの知ったかぶり
0214デフォルトの名無しさん
2005/08/06(土) 21:04:432: my $mw = new MainWindow();
3: my $img = $mw->Photo(...);
これの3行目の処理をCから行いたいのですが、
どうすればいいのでしょうか?
Tk_CreatePhotoImageFormat を使う方法は出来たのですが、
これではPerl側が画像を作るのを待つしかありません。
そうじゃなくて、Cから画像を作りたいのですが、どうすればいいのでしょう。
0215デフォルトの名無しさん
2005/08/06(土) 22:00:41ヒント: call_sv
0216デフォルトの名無しさん
2005/08/07(日) 00:12:33方法ってある?
0217デフォルトの名無しさん
2005/08/07(日) 00:15:500218デフォルトの名無しさん
2005/08/07(日) 00:19:35Devel::DProf
0219デフォルトの名無しさん
2005/08/07(日) 01:29:45Devel::Profile
0220216
2005/08/07(日) 01:53:14やってみます
0221デフォルトの名無しさん
2005/08/07(日) 03:10:48#!C:/perl/bin/perl
open(IN, "./001.gif");
binmode(IN);
read(IN, $image, -s "./001.gif");
close(IN)
binmode(STDOUT);
print "Content-type: image/gif\n";
print $image;
exit;
上のcgiをローカルのテストサーバー(http://127.0.0.1/001.cgi)で表示させようとしても
Internal Server Errorと表示されます
どこが間違っているのでしょうか?
0222デフォルトの名無しさん
2005/08/07(日) 03:33:490223デフォルトの名無しさん
2005/08/07(日) 03:37:09OK、ジョニー、ICIC
;が抜けてるのと
./が余計だったんだな
0224デフォルトの名無しさん
2005/08/07(日) 04:03:160225デフォルトの名無しさん
2005/08/07(日) 04:12:22Cのほうがやりやすいわ
0226デフォルトの名無しさん
2005/08/07(日) 04:16:560227デフォルトの名無しさん
2005/08/07(日) 04:17:55Perlの複雑さは並じゃない。更に不条理(ry
>>215
サンクスです。
0228デフォルトの名無しさん
2005/08/07(日) 06:25:39なんたって
print "Hello world.";
でOKだからな。
0229デフォルトの名無しさん
2005/08/07(日) 10:43:370230デフォルトの名無しさん
2005/08/07(日) 12:13:56むしろそういうところがややこしい
Cなら関数にかならず()をつけるのだが、こっちは省略OKなんだろ
、がくるのかスペースがくるのかが曖昧なんだよ
そういう点ではCに慣れた人にはとっつきにくい
0231デフォルトの名無しさん
2005/08/07(日) 12:19:47Spidering Hacksでライブラリの使い方知ってから奥深さに気がついた
0232デフォルトの名無しさん
2005/08/07(日) 12:21:17省略 OK だが、省略しなければいけないワケではない。
嫌なら自分で () 付ける癖を付ければいいだろう。
読む時はほとんど問題にならないし。
0233デフォルトの名無しさん
2005/08/07(日) 13:18:45一つ一つの要素を取り出すときに、よく使われる表現や関数などは
どのような物がありますか?
文字コードをチェックしていくのは効率が悪いと思うので。
0234デフォルトの名無しさん
2005/08/07(日) 13:23:22split
0235デフォルトの名無しさん
2005/08/07(日) 13:23:540236デフォルトの名無しさん
2005/08/07(日) 14:03:200237デフォルトの名無しさん
2005/08/07(日) 14:26:54ありがとうございました。
0238デフォルトの名無しさん
2005/08/07(日) 15:46:18まあ自分でプログラム組むときはそれでいいけど
他人のソースを解読するときに$_とかそういうのが出てくると一瞬戸惑う
0239デフォルトの名無しさん
2005/08/07(日) 16:22:31他人が読むときに大変だとか考える必要はありません
0240デフォルトの名無しさん
2005/08/08(月) 00:18:09my $file = shift;
my $openmode = O_WRONLY|O_CREAT;
$openmode |= O_EXCL if !$cfg->{overwrite};
sysopen my $fh, $file, $openmode or die "Error: $!\n";
binmode $fh, ':raw';
flock $fh, LOCK_EX or die "Error: $!\n";
seek $fh, 0, 0 or die "Error: $!\n";
truncate $fh, 0 or die "Error: $!\n";
return $fh;
}
ファイル名を引数にとって、ファイハンドルを返すんだけど、このコードでなにか問題点あったら指摘してくれ。
sysopen使ったことないからよくわからん。
(サブルーチン名は適当)
0241デフォルトの名無しさん
2005/08/08(月) 00:47:160242デフォルトの名無しさん
2005/08/08(月) 02:24:46<q cite="http://perldoc.jp/docs/perl/5.8.0/perlstyle.pod">
変数のスコープや性質を表現するのに、大文字小文字を使うと便利でしょう。
</q>
if ! なんて書くなら unless にするとか、なぜ %cfg じゃなくわざわざ
ハッシュリファレンスなのよとか、こんな限定された開き方をサブ
ルーチン化する必要があるほど頻繁にやるのかとか、どうせなら
クラス書けよとか、サブルーチンの最後で値を返す時は陽に return
しない方が速いとか、嗜好の違いからくる指摘は色々できるな。
0243デフォルトの名無しさん
2005/08/08(月) 03:05:020244デフォルトの名無しさん
2005/08/08(月) 03:06:080245デフォルトの名無しさん
2005/08/08(月) 03:10:05よくそれ聞くんだが、そう言う場合って完全にflockは使えないの?
お気に入りの方法あったら教えてくだはい。。
0246デフォルトの名無しさん
2005/08/08(月) 05:59:38http://homepage1.nifty.com/glass/tom_neko/web/web_04.html
0247デフォルトの名無しさん
2005/08/08(月) 10:57:38O_TRUNCみたいなファイルをいじってしまうオプションつけてない
からそれ自体は別に問題ないと思う。
むしろ問題なのは何をやるつもりなのかが明確に示されてない
ことだ。それがないとこれでいいのかどうかはなんとも言えない。
「ファイル名を引数にとって、ファイハンドルを返す」もの
ではあるようだが。
truncateの前のseekはあきらかに無駄だと思うけどね。
0248デフォルトの名無しさん
2005/08/08(月) 14:02:500249デフォルトの名無しさん
2005/08/08(月) 14:55:32http://perldoc.jp/docs/modules/PAR-0.75/lib/PAR/Intro.pod
0250デフォルトの名無しさん
2005/08/08(月) 16:26:06ふつうにopenで読み込むとメモリが大量に食われてしまいます
どのようにすれば回避できますか?
ちなみに処理の内容は、改行ありのテキストを配列に読み込んで
一行ずつ特定の文字を置き換えるだけです。
0251デフォルトの名無しさん
2005/08/08(月) 16:42:36ふつうにopenすりゃ良いんだけど、配列に読み込まず一行ずつ読み込んで処理汁
ファイルに書き出す必要があるならテンポラリファイルに書き込む。
で、その後リネーム
0252250
2005/08/08(月) 21:50:49ありがとうございます
0253デフォルトの名無しさん
2005/08/09(火) 00:07:59末尾が英小文字.xxx.yyy だったらTrue を返す正規表現って
どう書けばいい?
例:'abc.xxx.yyy' True
'abc.xxx.yyy' False
([a-z]+\.)+(?!xxx\.yyy)$
と書いたけど、ねらったようにTrue にならない。
「(?!xxx.yyy)」と「$」を組み合わせると
うまくいかないみたいだけど。
誰か正規表現のプロいない?
0254デフォルトの名無しさん
2005/08/09(火) 00:10:18でいいんじゃないのか?
0255デフォルトの名無しさん
2005/08/09(火) 00:15:01[a-z]\.xxx\.yyy$
かな。
てか2つの例の違いがわからんのだが。
0256デフォルトの名無しさん
2005/08/09(火) 00:56:07ごめん、例を間違えたorz
書き直し。
$_ に文字列が入っている場合に
末尾が英小文字.xxx.yyy 以外だったらTrue を返す正規表現って
どう書けばいい?
例:'abc.xxx.yyy' False
'abc.xxx.yyy.zzz' True
([a-z]+\.)+(?!xxx\.yyy)$
と書いたけど、ねらったようにTrue にならない。
「(?!xxx.yyy)」と「$」を組み合わせると
うまくいかないみたいだけど。
誰か正規表現のプロいない?
0257デフォルトの名無しさん
2005/08/09(火) 01:01:38> >>253
ごめん、質問も訂正してあります。
末尾が英小文字.xxx.yyy だったらTrue を返す正規表現って
↓
末尾が英小文字.xxx.yyy 以外だったらTrue を返す正規表現って
「以外」の文字が増えています。
0258デフォルトの名無しさん
2005/08/09(火) 01:05:16!/[a-z]\.xxx\.yyy$/
■ このスレッドは過去ログ倉庫に格納されています