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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2005/07/20(水) 05:15:36
"The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。

CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板 http://pc8.2ch.net/php/ )

CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。

http://www.perl.org/get.html
● 2005/03/17現在の最新版: 5.8.7
● 2005/03/17現在の開発版: 5.9.2
0159デフォルトの名無しさん2005/08/03(水) 00:39:42
%7Eって '~' だよね。
0160デフォルトの名無しさん2005/08/03(水) 00:51:42
>>153
PGIDしらべてプロセスグループを殺すとか、
調べるのめんどくさければ他のも巻き添え
食うの覚悟でkill -1という手もある。
0161デフォルトの名無しさん2005/08/03(水) 01:03:22
>>160
>kill -1
ドラえもんが、ネズミを駆除するのに「地球破壊ばくだん」を使おうとした話を
思い出したw いや確かに、繁殖力の強いネスミを絶滅させるにはそれしかないん
だろうけどw
0162デフォルトの名無しさん2005/08/03(水) 01:05:04
>>158


じゃあ、単純に 
/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:42
>>162
rfc1738
0164デフォルトの名無しさん2005/08/03(水) 02:05:05
>>163
サンクスコ

% → %25 で直りマスタ
0165デフォルトの名無しさん2005/08/03(水) 02:07:47
>>162
> じゃあ、単純に 
> /var/www/hoge/hoge%hoge.jpg
>
> というファイルがあって、それをブラウザで表示する
> http://hoge.com/hoge%hoge.jpg

http://hoge.com/hoge%25hoge.jpg

でイクのかな?

っていうか、ブラウザのメッセージくらい見ろよ。
0166デフォルトの名無しさん2005/08/03(水) 09:52:58
パスワードをGETデータで扱うのはやめたほうがいいでしょうか。
HTTP_REFERERでパスが漏れるのが心配なんですが
他のサイトへのリンクを貼らなければ大丈夫ですか?
0167デフォルトの名無しさん2005/08/03(水) 10:51:47
仕事でPerlのソース読んでるんですが、以下の関数の結果は違うのでしょうか。

&jcode'convert()
&jcode::convert()
(引数省略)

エディタの色分けがおかしくなってしまうので、「::」の形式に統一したいのですが
問題ないでしょうか?
0168デフォルトの名無しさん2005/08/03(水) 11:02:52
>>167
その糞エディタを(ry

他人のコードを読むにあたってエディタの都合で
コード改変というのは発想が間違っている。

そもそも質問にあるようなコードぐらい自分で検証できんのかと。
0169デフォルトの名無しさん2005/08/03(水) 11:38:54
>>161
> 地球破壊ばくだん
正確には「地球はかい爆弾」。


・・・恐ろしくどうでもいい指摘だなw
0170デフォルトの名無しさん2005/08/03(水) 12:42:38
>>167
perlmodによれば
古いパッケージ区切り子はシングルクォートでしたが、
現在はダブルコロンを使うのが推奨されています。
なぜなら、この方が人間が読みやすいということと、emacsで読みやすいからです。
これはまた、 C++プログラマーに自分が知っていることのように思わせるようにもします。
それは以前のシングルクォートがAdaプログラマに馴染みのものでであったことと同じです。
0171デフォルトの名無しさん2005/08/03(水) 13:37:57
>>168
>>170
レスありがとうございます。
コード改変についてはそれが許されている状況だったもので。
検証はしてみたのですが、違いが無かったので心配したわけです。
ありがとうございました。
0172デフォルトの名無しさん2005/08/03(水) 14:11:46
>>166
そのパスワードが漏れてもいいようなどうでもいいものならそれでいいんじゃね?
0173デフォルトの名無しさん2005/08/03(水) 14:18:33
>>171
168は許されている許されていないの問題ではなく、
エディタの都合でソースを弄るということが
決定的な間違いだと言っておると思うのだが。
0174デフォルトの名無しさん2005/08/03(水) 14:37:37
>173
Perl4時代の古い習慣だし、直していいんじゃね?

コロン2つになった理由の一つもコレだし↓
>なぜなら、この方が人間が読みやすいということと、emacsで読みやすいからです。
                                ~~~~~~

ついでに言うと、古い*.plライブラリを*.pmモジュールに変換する
pl2pmなるユーティリティがPerlディストリビューションに含まれている。
つまり、これは非常識でもなんでもない。
0175デフォルトの名無しさん2005/08/03(水) 15:12:05
ってかいちいち独りよがりの妄想で自分で自分を縛ってたら、
仕事が遅くなるだけじゃねーかw
そんな考え、誰も評価しませんから〜。!残念!
0176デフォルトの名無しさん2005/08/03(水) 16:59:12
今時ギター侍・・・
0177デフォルトの名無しさん2005/08/03(水) 17:32:19
外界との接触が少ないんだろ
0178デフォルトの名無しさん2005/08/03(水) 21:25:28
しかも句点の後ろにエクスクラメーションマークだもんな。
0179デフォルトの名無しさん2005/08/04(木) 13:20:27
GDをインストールしようとした。
makeは成功したが、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:08
こんにちは。質問です。

cのgetprognameみたいなものってありますでしょうか?
$0を自分で整形するのが普通なんでしょうか?
0181デフォルトの名無しさん2005/08/04(木) 18:17:33
基本的な質問で、すいません。
パールは、クライアントの入力情報を反映させて、
HTMLソースを生成できますが、
HTMLソースにパールを埋め込んで?(そのページが「○○○.cgi]ではなく「○○○.htm」の形で)
クライアント(HP閲覧者)の環境変数を取得することは可能でしょうか?

他に環境変数を取得できる方法とその言語、そのサーバーの環境を教えてください。


よろしくお願いします。
01821812005/08/04(木) 18:20:08
ずれてますね。失礼しました。
0183デフォルトの名無しさん2005/08/04(木) 20:51:50
Cにgetprogname()なんて無かったと思うが
0184デフォルトの名無しさん2005/08/04(木) 21:58:35
>>181
WebProgへ行きなされ
0185デフォルトの名無しさん2005/08/04(木) 22:03:43
>>183
それが最近はあるんだな。オレは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
>>185
それは C にあるとは言わん
0187デフォルトの名無しさん2005/08/04(木) 22:19:13
で、回答としては$0を自分で整形しろでいいのかね?
File::Basenameあたりは使えると思うけど、もっと
これ専用のものってなんかあるっけ?
0188デフォルトの名無しさん2005/08/04(木) 23:20:24
OSによって違うけど、少くともBSDじゃ
$0に代入するとperlの中の人がsetprogname()を呼んでいる。
0189デフォルトの名無しさん2005/08/04(木) 23:22:38
というか何をしたいのかがわからん。
0190デフォルトの名無しさん2005/08/04(木) 23:22:55
あ、ごめん、設定したいじゃなくて参照したいのか。
それならプログラム先頭で (my $__progname = $0) =~ s,.*/,,; で十分だろ。
Cのgetprogname()もやってることは同じだ。
0191デフォルトの名無しさん2005/08/04(木) 23:23:14
というか → ていうか
0192デフォルトの名無しさん2005/08/05(金) 11:08:49
>>183-190

ありがとうございました。
FindBinってのもあるみたいです。
01931342005/08/05(金) 11:35:29
>>148
そんなワザがあるのかぁ…勉強になります。

とりあえず今回は穏便に、毎回プロセスを終了するようにしますた。
カネ払ってしまったからリスクのあることは出来ないのでね…
0194デフォルトの名無しさん2005/08/05(金) 12:40:57
Aug 5 12:21:42 mew sm-mta[24903]: [ID 801593 mail.info] j753LgZN024903: from=<[email protected]>, size=2096, class=0, nrcpts=1, msgid=<[email protected]>, proto=SMTP, daemon=MTA, relay=[211.112.50.123]
こういうログがあるときに、
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
>>193
> そんなワザがあるのかぁ…勉強になります。

×ワザ
○ワナ
0196デフォルトの名無しさん2005/08/05(金) 13:56:40
>>194
@mailが展開されてたぶん空文字列になってるから。
0197デフォルトの名無しさん2005/08/05(金) 16:50:54
>>196
okay!
Thanks.
0198デフォルトの名無しさん2005/08/05(金) 21:39:47
>>194
Sendmailなんて化石のようはソフトを使ってるから
0199デフォルトの名無しさん2005/08/05(金) 21:47:58
ようは
0200デフォルトの名無しさん2005/08/05(金) 22:11:38
>>198
え? SenderID とか Domainkeys とかの最新技術にまともに対応してんのって、
sendmail くらいしか無いじゃん。どこが化石よ。
0201デフォルトの名無しさん2005/08/06(土) 03:31:49
>>200
>>198をよく見ればわかるけど初心者を相手にしてどうする?
そのうち彼はperlのことも化石にしてしまうと思うぞ。
0202デフォルトの名無しさん2005/08/06(土) 03:51:50
perlは既に化石だから心配無用かと
0203デフォルトの名無しさん2005/08/06(土) 15:04:55
s/�\/IX/g;

ということをやらせたいのですが、sjisで書くと通りません
全角文字部分をヒアドキュメントにするにはどうすればいいですか
0204デフォルトの名無しさん2005/08/06(土) 15:19:58
>>203
ローマ数字の 9 は Shift_JIS だと \x87\x5C で、
http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm#errors
の「エラーにはならないけど文字化けする(1)」に相当する。
0205デフォルトの名無しさん2005/08/06(土) 15:41:43
require 5.8.1;
use encoding "cp932";
0206デフォルトの名無しさん2005/08/06(土) 17:43:44
chomp($pat = <<'EOF');
�\
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
>>206
>>205
0208デフォルトの名無しさん2005/08/06(土) 18:01:28
わからないなら辞めちまえ
0209デフォルトの名無しさん2005/08/06(土) 18:09:47
v5.6.1 で使う限り、有効な解決方法が存在しないまたは誰もしらない
ということですね
0210デフォルトの名無しさん2005/08/06(土) 18:38:20
いえ、あなたが開発者である限り無理ってことです
0211デフォルトの名無しさん2005/08/06(土) 18:45:55
�\を�\\と書いて直接埋め込むことで解決はします
ヒアドキュメントを使った方法は不可能です
0212デフォルトの名無しさん2005/08/06(土) 18:47:49
>>204
3行目が嘘。

>>206
$pat の中身は \x87\x5C なので何の解決にもなっていない。

>>207
http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm#regexp
0213デフォルトの名無しさん2005/08/06(土) 19:02:45
2バイト文字をコードに直接書くことに起因する問題の多くは
ヒアドキュメントを使うことで回避できるけれど、
この場合はパターンマッチの中に使おうとしており、
どうせ文字列の評価が発生するので避けられない

何か方法がありそうな口ぶりの>>208や>>210は
ただの知ったかぶり
0214デフォルトの名無しさん2005/08/06(土) 21:04:43
1: use Tk;
2: my $mw = new MainWindow();
3: my $img = $mw->Photo(...);

これの3行目の処理をCから行いたいのですが、
どうすればいいのでしょうか?

Tk_CreatePhotoImageFormat を使う方法は出来たのですが、
これではPerl側が画像を作るのを待つしかありません。
そうじゃなくて、Cから画像を作りたいのですが、どうすればいいのでしょう。
0215デフォルトの名無しさん2005/08/06(土) 22:00:41
>>214
ヒント: call_sv
0216デフォルトの名無しさん2005/08/07(日) 00:12:33
妙に実行に時間がかかるPerlスクリプトがあるんだけどお手軽に各サブルーチンの実行時間を計測するような
方法ってある?
0217デフォルトの名無しさん2005/08/07(日) 00:15:50
use Benchmark;
0218デフォルトの名無しさん2005/08/07(日) 00:19:35
>>216
Devel::DProf
0219デフォルトの名無しさん2005/08/07(日) 01:29:45
>>216
Devel::Profile
02202162005/08/07(日) 01:53:14
thx
やってみます
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:49
HTTPヘッダが終わってない。
0223デフォルトの名無しさん2005/08/07(日) 03:37:09
>>222
OK、ジョニー、ICIC
;が抜けてるのと
./が余計だったんだな
0224デフォルトの名無しさん2005/08/07(日) 04:03:16
一番の間違いはエラーログ見てないことだろ
0225デフォルトの名無しさん2005/08/07(日) 04:12:22
パール難しすぎ、っていうかややこしい
Cのほうがやりやすいわ
0226デフォルトの名無しさん2005/08/07(日) 04:16:56
はいはい
0227デフォルトの名無しさん2005/08/07(日) 04:17:55
そんな分かりきったことを何故ageで。
Perlの複雑さは並じゃない。更に不条理(ry

>>215
サンクスです。
0228デフォルトの名無しさん2005/08/07(日) 06:25:39
Perlのいいところはとっつきやすいところだと思う。
なんたって

print "Hello world.";

でOKだからな。
0229デフォルトの名無しさん2005/08/07(日) 10:43:37
p "Hello world."
0230デフォルトの名無しさん2005/08/07(日) 12:13:56
>>228
むしろそういうところがややこしい
Cなら関数にかならず()をつけるのだが、こっちは省略OKなんだろ
、がくるのかスペースがくるのかが曖昧なんだよ
そういう点ではCに慣れた人にはとっつきにくい
0231デフォルトの名無しさん2005/08/07(日) 12:19:47
perlの文法は慣れるまで大変だったけどなれたらすごい便利
Spidering Hacksでライブラリの使い方知ってから奥深さに気がついた
0232デフォルトの名無しさん2005/08/07(日) 12:21:17
>>230
省略 OK だが、省略しなければいけないワケではない。
嫌なら自分で () 付ける癖を付ければいいだろう。

読む時はほとんど問題にならないし。
0233デフォルトの名無しさん2005/08/07(日) 13:18:45
スペースやタブ(または特定の区切り文字)で区切られた文字データから、
一つ一つの要素を取り出すときに、よく使われる表現や関数などは
どのような物がありますか?
文字コードをチェックしていくのは効率が悪いと思うので。
0234デフォルトの名無しさん2005/08/07(日) 13:23:22
>>233
split
0235デフォルトの名無しさん2005/08/07(日) 13:23:54
split
0236デフォルトの名無しさん2005/08/07(日) 14:03:20
PerlIOって一言でいって、libcのバッファリングする入出力関数に依存しないってことなに?
0237デフォルトの名無しさん2005/08/07(日) 14:26:54
>>234-235
ありがとうございました。
0238デフォルトの名無しさん2005/08/07(日) 15:46:18
>>232
まあ自分でプログラム組むときはそれでいいけど
他人のソースを解読するときに$_とかそういうのが出てくると一瞬戸惑う
0239デフォルトの名無しさん2005/08/07(日) 16:22:31
ここには趣味プログラマしかいないので
他人が読むときに大変だとか考える必要はありません
0240デフォルトの名無しさん2005/08/08(月) 00:18:09
sub XXX ($) {
my $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:16
読みにくい
0242デフォルトの名無しさん2005/08/08(月) 02:24:46
>>240
<q cite="http://perldoc.jp/docs/perl/5.8.0/perlstyle.pod">
変数のスコープや性質を表現するのに、大文字小文字を使うと便利でしょう。
</q>

if ! なんて書くなら unless にするとか、なぜ %cfg じゃなくわざわざ
ハッシュリファレンスなのよとか、こんな限定された開き方をサブ
ルーチン化する必要があるほど頻繁にやるのかとか、どうせなら
クラス書けよとか、サブルーチンの最後で値を返す時は陽に return
しない方が速いとか、嗜好の違いからくる指摘は色々できるな。
0243デフォルトの名無しさん2005/08/08(月) 03:05:02
俺もハッシュはわざわざリファレンスで使う癖があるな
0244デフォルトの名無しさん2005/08/08(月) 03:06:08
上書きopenしたあとにflockして何の意味があるのやら
0245デフォルトの名無しさん2005/08/08(月) 03:10:05
>>244
よくそれ聞くんだが、そう言う場合って完全にflockは使えないの?
お気に入りの方法あったら教えてくだはい。。
0246デフォルトの名無しさん2005/08/08(月) 05:59:38
>>245
http://homepage1.nifty.com/glass/tom_neko/web/web_04.html
0247デフォルトの名無しさん2005/08/08(月) 10:57:38
>>244
O_TRUNCみたいなファイルをいじってしまうオプションつけてない
からそれ自体は別に問題ないと思う。

むしろ問題なのは何をやるつもりなのかが明確に示されてない
ことだ。それがないとこれでいいのかどうかはなんとも言えない。
「ファイル名を引数にとって、ファイハンドルを返す」もの
ではあるようだが。

truncateの前のseekはあきらかに無駄だと思うけどね。

0248デフォルトの名無しさん2005/08/08(月) 14:02:50
PerlScriptをWindows実行ファイルにするにはどうすればいいですか?
0249デフォルトの名無しさん2005/08/08(月) 14:55:32
>>248
http://perldoc.jp/docs/modules/PAR-0.75/lib/PAR/Intro.pod
0250デフォルトの名無しさん2005/08/08(月) 16:26:06
100Mのテキストファイルを処理したいんですが
ふつうにopenで読み込むとメモリが大量に食われてしまいます
どのようにすれば回避できますか?

ちなみに処理の内容は、改行ありのテキストを配列に読み込んで
一行ずつ特定の文字を置き換えるだけです。
0251デフォルトの名無しさん2005/08/08(月) 16:42:36
>>250
ふつうにopenすりゃ良いんだけど、配列に読み込まず一行ずつ読み込んで処理汁
ファイルに書き出す必要があるならテンポラリファイルに書き込む。
で、その後リネーム
02522502005/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
\.xxx\.yyy$
でいいんじゃないのか?
0255デフォルトの名無しさん2005/08/09(火) 00:15:01
ああ、すまん。英小文字からか。
[a-z]\.xxx\.yyy$
かな。
てか2つの例の違いがわからんのだが。
0256デフォルトの名無しさん2005/08/09(火) 00:56:07
>>253
ごめん、例を間違えた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
>>256
> >>253
ごめん、質問も訂正してあります。

末尾が英小文字.xxx.yyy だったらTrue を返す正規表現って
↓
末尾が英小文字.xxx.yyy 以外だったらTrue を返す正規表現って

「以外」の文字が増えています。
0258デフォルトの名無しさん2005/08/09(火) 01:05:16
>>256
!/[a-z]\.xxx\.yyy$/
■ このスレッドは過去ログ倉庫に格納されています