- 1 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 00:07:22 ]
- "The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。 CGIについての質問は板違いです。WEBプログラミング板でどうぞ。 CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。 (WEBプログラミング板 ttp://pc11.2ch.net/php/ ) CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。 このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。 スレ違いの質問にはスルーか、速やかな誘導をお願いします。 ttp://www.perl.org/get.html ● 2008/01/11現在の最新版: 5.10.0 ● 2007/01/11現在の開発版: 5.9.5 前スレ Perlについての質問箱 33箱目 pc11.2ch.net/test/read.cgi/tech/1192463997/ リンク集は>>2-3 過去スレは>>4 あたり
- 533 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 10:18:31 ]
- >>532
<q cite="perldoc.jp/docs/perl/5.10.0/perlfunc.pod#item_eval_BLOCK"> 構文エラーや実行エラーが発生するか、die 文が実行されると、 eval の値として未定義値が返され、$@ にエラーメッセージが設定されます。 エラーがなければ、$@ は、空文字列であることが保証されます。 </q>
- 534 名前:530 mailto:sage [2008/02/24(日) 11:01:47 ]
- >>531
ごめん。ぼけてみたんだけど、はずした。
- 535 名前:デフォルトの名無しさん [2008/02/24(日) 11:42:40 ]
- >>533
どうもです!構文エラーと実行エラー以外に$@が設定されるエラーはないと 考えていいんですよね??素人丸出しな質問ですが。
- 536 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 13:15:54 ]
- >>535
search.cpan.org/dist/perl-5.10.0/pod/perlvar.pod#EVAL_ERROR <q cite="perldoc.jp/docs/perl/5.6.1/perlvar.pod"> 最後の eval() 操作子による Perl の構文エラーメッセージです。 </q>
- 537 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 20:02:29 ]
- >>534
いやまあ、あなたのことじゃないんで気にしないで
- 538 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 02:30:35 ]
- コンパイル時にパッケージ名とサブルーチン名を区別できない可能性があるから、
サブルーチンの名前には大文字を使わないと聞いたことがあるのですが本当でしょうか? また実際に区別できないことがあるのは、どういった使い方をした場合でしょうか?
- 539 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 11:05:25 ]
- >>538
コンパイラが大文字小文字でパッケージ名と関数名の 区別を付ける事はないので嘘。 perldoc.jp/docs/perl/5.8.0/perlstyle.pod > 実際に区別できないことがある 人間が区別を付けにくいという意味では func_or_method FuncOrClassOrFh @arg;
- 540 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 15:03:13 ]
- あ
- 541 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 16:07:27 ]
- >>539
回答ありがとうございます。 一般的にパッケージ名に大文字を使うため、サブルーチンの名前にも大文字を使うと、 パッケージ名とサブルーチン名が重複する可能性があり、 重複するとコンパイラが区別ができないことがあるのかと、 疑問に思ってるのですが、これについてはどうでしょうか?
- 542 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 16:50:13 ]
- 「名前空間」の勉強してこいよ
- 543 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 17:11:44 ]
- ?
- 544 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 18:01:02 ]
- 重複して困るのはサブルーチン名でなくラベルやファイルハンドル。
#!/usr/bin/perl -w use strict; package Foo; sub Foo { join '', @_ } package Bar; sub Bar { print 'Bar!' } package main; # これはOK # print Foo Foo Foo => "\n", Foo->Foo("Foo!\n"); # FooFoo\nFooFoo!\n # Bar Bar; __END__ Bar! # パッケージ名と同名のファイルハンドル # open Foo, '>./Foo.txt' or die $!; # Foo->Foo('Foo!'); # ここで混乱して実行時エラー # close Foo; __END__ # goto EXPR を goto LABEL で解釈してコンパイルエラー # for (1..5) { $_ > 2 ? goto Foo Foo 'Foo' : print "$_, " } # FooFoo: print 'foo!'; __END__ # 優先順位の明確化で解決 # for (1..5) { $_ > 3 ? goto(Foo Foo 'Foo') : print "$_, " } # FooFoo: print 'foo!'; __END__ 1, 2, 3, foo!
- 545 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 18:45:04 ]
- >>544
非常に分かりやすく解説してくださってありがとうございます。 perl.g.hatena.ne.jp/bosh/20060409 こちらで書いてあるのは間違いということで、理解しました。
- 546 名前:デフォルトの名無しさん [2008/02/26(火) 21:59:27 ]
- 素人が趣味で書いたホームページを鵜呑みにされても・・・
- 547 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 23:18:46 ]
- 何かあるのかと思って確認のために聞いただけじゃないか
- 548 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 10:27:01 ]
- 素人かどうかなんてわからないだろ
- 549 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 10:28:24 ]
- わからないなら素人として扱うのが安全だろ
- 550 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 11:18:38 ]
- じゃあここでレスしてるのも素人ばっかりだなw
- 551 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 16:12:38 ]
- お前はその前提で喋ってればいいんじゃね?
馬鹿だなーって思われるだけだけど。
- 552 名前:デフォルトの名無しさん [2008/02/27(水) 16:23:09 ]
- わかった。>>551は超素人ってことで。
- 553 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 16:42:13 ]
- 笑うところだろw
まぁ鵜呑みにするな、っていうのは真理だな
- 554 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 22:22:22 ]
- 素人です。教えてください。
何もわかりません。動きません。 絶対プログラムは正しいので、Perlのバグだと思うのです。 ・・・・。
- 555 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 22:32:58 ]
- どっかのコピペか?
- 556 名前:デフォルトの名無しさん [2008/02/28(木) 09:41:09 ]
- 質問です。
func_hoge() というサブルーチンがあります。 このサブルーチンは、内部でエラーが起こった場合のみ、エラー番号やエラーメッセージを返してきます。 何も問題なければ 0 やら空文字列が返ってくるとします。 func_hoge()を呼び出すときは、 my $err = func_hoge(); if ($err) { die "Error func_hoge [$err]"; } というように返り値を保持しておき、 エラーがあれば、その時のエラー番号(可能であればサブルーチン名などの目印も)を表示したい。 これはこれで全く問題ないのですが、func_hoge()の呼び出し箇所が増えると エラー格納用の一時的な変数が増えてしまいますし、何より面倒です。 何か楽できる方法ありませんか?
- 557 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 11:00:53 ]
- func_hoge de die
- 558 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 11:13:37 ]
- func_hoge()の中でuse Carpしてcroakすればいいんじゃね?
die させないときはeval{}で囲えばいいし。
- 559 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 11:46:45 ]
- サブルーチンの中を弄らないと無理かー。
呼び出し側だけで何とか小手先の変更で出来ないかなとか考えてた。ありがとう。
- 560 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 12:41:38 ]
- ん?
push @err, func_hoge(); みたいなもんでいいのかな。
- 561 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 12:53:34 ]
- 新しいサブルーチン作ればいいじゃん。
- 562 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 14:44:00 ]
- if (my $err=func_hoge()) { die "Error func_hoge [$err]"; }
- 563 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 22:13:15 ]
- >560
状況にもよるけど、サブルーチンを呼ぶたびにエラー判定しなきゃならないような類だと 結局手間は変わんないかも。 >561 最終的には多分そうなると思う。 >562 やっぱそれが一番スマートなのかなあ。
- 564 名前:デフォルトの名無しさん [2008/02/29(金) 00:37:04 ]
- Perlってパースした後の構文木をプログラムで書き換えることはできないの?
- 565 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 03:20:56 ]
- dieで死ぬだけなら再利用しちゃえばいいんじゃないの?w
- 566 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 09:02:53 ]
- >>564
目的は?
- 567 名前:デフォルトの名無しさん [2008/02/29(金) 10:51:40 ]
- Perl の localtime 関数はエポックからの秒数をローカル時刻の年月日に
分解してくれますね。これとは逆に、ローカル時刻の年月日を エポックからの秒数に変換するにはどうしたらよろしいでしょうか?
- 568 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 11:05:27 ]
- timelocal
- 569 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 13:23:58 ]
- 一度くらい自分で作ってみるのも悪くないけど(簡単だから)、
出来上がったらそれ以降は>>568を使っておけばいいな。
- 570 名前:デフォルトの名無しさん [2008/02/29(金) 14:22:22 ]
- Perl で split 関数が返す配列を、一度配列に入れずに、すぐに配列参照として
受け取ることはできますか? $ar = split(/,/, $str); $ar_ref = \@ar; じゃなくて $ar_ref = split(/,/, $str); のようにしたい。 ↓こんなのじゃうまくいかなかった。 $ar_ref = \split(/,/, $str);
- 571 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 14:38:52 ]
- anonymous array reference constructor
- 572 名前:デフォルトの名無しさん [2008/02/29(金) 14:43:44 ]
- >>571
つまり、こういうことですか? $ar_ref = [ split(/,/, $str) ]; でも、これだと、配列の要素をコピーすることになりそうで (なりますよね?) 無駄ではありませんか?
- 573 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 14:45:55 ]
- >>572
実際の動作がどうなるのかはソースを読む。 読みたくないなら、明らかにコピーしそうなperlコードとBenchmarkで比較。
- 574 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 15:05:51 ]
- >>572
最適化されるよ。
- 575 名前:デフォルトの名無しさん [2008/02/29(金) 16:29:22 ]
- >>574
証拠はある?
- 576 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 16:39:17 ]
- 証拠がソースだったら読むのか?
- 577 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 16:47:30 ]
- 他人に頼りすぎだ。
パフォーマンスが気になるなら、ちょっと確かめてみればいい。 こんなコード断片が書けないのなら、パフォーマンスなど気にするだけ無駄。 use Benchmark qw(timethese); my $source = join(',', ('abcdefg')x80000); my $result_ref; timethese(100, { temp => sub { my @temp_array = split(/,/, $source); $result_ref = \@temp_array; }, bracket => sub { $result_ref = [ split(/,/, $source) ]; }, none => sub { split(/,/, $source); }, }); Benchmark: timing 100 iterations of bracket, copy, none, temp... bracket: 9 wallclock secs ( 8.94 usr + 0.00 sys = 8.94 CPU) @ 11.19/s (n=100) none: 6 wallclock secs ( 6.76 usr + 0.00 sys = 6.76 CPU) @ 14.80/s (n=100) temp: 15 wallclock secs (14.27 usr + 0.00 sys = 14.27 CPU) @ 7.01/s (n=100)
- 578 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 17:00:25 ]
- >>575
証拠は俺の脳内。 信じられないなら自分でソース読もう。
- 579 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 17:54:31 ]
- >>577
void コンテキストで split 使うと @_ に入るので注意な。
- 580 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 19:05:26 ]
- lala-zコンテキストなら?
- 581 名前:ジミー [2008/02/29(金) 21:41:12 ]
- $str = "a,b,";
@ar = split(/,\n/, $str); print join(',', @ar); これを実行すると a,b と表示されます。 つまり、split は末尾の空文字列を取り出してくれないようです。 末尾の空文字列を取り出して、このコードが a,b, と表示させるように するための簡単な方法ってありませんかね。 (もちろん愚直に工夫すれば何とでもなるが、スマートな解がほしい)
- 582 名前:ジミー [2008/02/29(金) 21:41:59 ]
- >581
コード間違えた。(実験してたコードにしてもた。) × @ar = split(/,\n/, $str); ○ @ar = split(/,/, $str);
- 583 名前:ジミー mailto:sage [2008/02/29(金) 21:46:48 ]
- 解決した。
@ar = split(/,/, $str, -1); ですね。
- 584 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 21:48:12 ]
- print join ',', split /,/, q/a,b,/, -1;
- 585 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 00:44:11 ]
- >>566
特にないけど、Perlならそういう面白いインターフェイスが用意されてそうだなと思ったまでで
- 586 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 01:06:48 ]
- 麻雀なのに、娘とか嫁とか家族とかw
乞食は想像を絶するなw
- 587 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 01:07:14 ]
- スマン、誤爆
- 588 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 09:16:39 ]
- 色々と妄想させてくれる。
世の中には「義妹が最強だろ」という誤爆レスが元になって作られたゲームとかあるからな。 人間の妄想力ってのは凄いもんだぜ。
- 589 名前:デフォルトの名無しさん [2008/03/02(日) 10:27:48 ]
- おにぃちゃん、ヤメテ!
- 590 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 10:48:55 ]
- ヘッヘッヘ、いいじゃねぇか ポン ヘッヘッヘ
- 591 名前:デフォルトの名無しさん [2008/03/02(日) 11:09:57 ]
- Active Perl 5.10.0 用の DBD-mysql ってどこにあるの?
- 592 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 11:48:26 ]
- >589-590
エロゲじゃねーよw
- 593 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:23:27 ]
- >>591
cpan.uwinnipeg.ca/PPMPackages/10xx/
- 594 名前:591 [2008/03/02(日) 21:46:50 ]
- >>593
ありがとう。無事インストできたよん。
- 595 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 09:11:40 ]
- インスト
- 596 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 09:43:34 ]
- 泣いても笑っても、お前のまんじゅうは無いよ。
- 597 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 16:28:09 ]
- Wiki文法でのテキスト整形で悩んでいます。
改行含めた長い文章が $i に入ってます。 文章中のリンクアンカーに相当する部分はWikipediaなどでお馴染みの [[テキスト]] という感じで書かれています。 これを $i =~ s/\[\[(.+?)\]\]/<a href="$1">$1<\/a>/g; で変換しているのですが、できれば <a href="$1"> の中のほうの$1をURLエンコードして収めたいのです。 URLエンコードのサブスクリプトはこんな感じです。 sub url_enc { local($_) = @_; s/(\W)/'%' . unpack('H2', $1)/eg; s/\s/+/g; $_; } よろしくお願いします。
- 598 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 16:49:12 ]
- すみません、補足です。
CGIにはインフォパスか引数で渡します。 <a href="hoge.cgi?$1"> こんな感じで。
- 599 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 17:31:00 ]
- サブルーチンに置換部分をまとめて、
$i =~ s/\[\[(.+?)\]\]/&url_enc($1)/eg;
- 600 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 17:58:47 ]
- そっか!e修飾子を利用した時は置換部分は関数以外は入れたらダメなんですね。
$i =~ s/\[\[(.+?)\]\]/<a href="&url_enc($1)">$1<\/a>/eg; だとエラーが出るんで何でだろうとずっと思ってたんです。 ありがとうございます。勉強になりました。
- 601 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 18:25:15 ]
- >>600
自分で '%' . unpack('H2', $1) なんてのを入れてるじゃん。 sub html_escape { my $str = $_[0]; $str =~ s/&(?!(?:\w+|#(?:[Xx][0-9A-Fa-f]+|[0-9]+));)/&/g; $str =~ s/([\x00-\x09\x0B\x0C\x0E-\x1F"'<>\x7F])/${ \ ord $1 };/g; $str; } sub uri_escape { my $str = $_[0]; $str =~ s/%(?![0-9A-Fa-f][0-9A-Fa-f])/%25/g; $str =~ s/([\x00-\x20"'<>\\^`{|}\x7F-\xFF])/ sprintf '%%%02X', ord $1 /eg; $str; } $i =~ s{ \[\[ (.+?) \]\] } { my($url, $face) = ($1, $1); $url = uri_escape($url); $face = html_escape($face); qq|<a href="$url">$face</a>|; }egx;
- 602 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 18:40:50 ]
- >>601
すみません、 実はurl_encは誰かから教えてもらったもので丸写しなんです ^_^ でも今回のことでやっともろもろ判りました。 コード、参考になります(というかありがたくいただきます)。 ありがとうございます。
- 603 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 05:49:41 ]
- JavaのプログラムからCGIを実行しようとしたのですが、302エラーが返されます。
何故なんでしょうか?
- 604 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 10:21:39 ]
- >>603
302 はエラーじゃないし Perl の話でもない。 www.studyinghttp.net/cgi-bin/rfc.cgi?2616#Sec10.3 CGI: Common Gateway Interface part 13 pc11.2ch.net/test/read.cgi/php/1126436361/
- 605 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 10:22:39 ]
- Moved Temporarily
- 606 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 13:38:15 ]
- >>604-605
パーミッションの設定をしたら動きました;; お騒がせしました
- 607 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 15:23:38 ]
- perlのuntil文っていらないと思うんですけど、皆さんどんなときに使ってますか?
- 608 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 16:30:42 ]
- 使わなきゃいいじゃん
- 609 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 17:00:16 ]
- while (! hoge)よりも直感的に書ける場合もある気がする
とくに後置したときに英文っぽくておさまりがいいような
- 610 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 17:23:51 ]
- while ( !( ... || ... && ... || ...) )
とかになったらさすがに使うw
- 611 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 17:26:43 ]
- あー、あと成功したら0エラーならエラーの種類が1以上って関数が
成功したらとにかく実行って時とかに == 0 とかやらなくて済むとか。
- 612 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 18:07:48 ]
- >>609->>611
なるほど。参考になりました。 untilも使い道はいろいろあるんですね。
- 613 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 18:32:27 ]
- 意味的に「〜になるまで続ける」って感じの時も until のがわかりやすいかも
- 614 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 18:37:39 ]
- >>613
確かに。これは考えたことなかったな。
- 615 名前:デフォルトの名無しさん [2008/03/06(木) 02:27:57 ]
- XSでCライブラリを使ったモジュールを作ったが、
それが$HOME/local/libのライブラリを使っていて CGIにLD_LIBRARY_PATHが設定できないのでモジュールで使っている.soが読めない。 $ENVとuse Envでやったが、無視されるみたいだし 共有サーバでhttpdがsuExecで動いているので.htaccessでSetEnvすることもできない。 DynaLoaderがロードする.soがリンクしているsoのパスを指定できる方法ある?
- 616 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 12:16:11 ]
- >>615
ldの-Rオプションでバイナリに埋め込むのはどう?
- 617 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 19:32:32 ]
- >>615
前スレの570〜580あたりで書き込みした者ですが、 DynaLoader.pmがLoadするだけならば、 use DynaLoader; @DynaLoader::dl_library_path に、対象のPATHを放り込んでやればLoad出来ます。 その{perl_module}.soがよその(/use/lib,/lib以外の)ライブラリをロードするようにコンパイルされていたら、 多分 use した時点でエラーになります。
|

|