Perlについての質問箱 ..
539:デフォルトの名無しさん
08/02/26 11:05:25
>>538
コンパイラが大文字小文字でパッケージ名と関数名の
区別を付ける事はないので嘘。
URLリンク(perldoc.jp)
> 実際に区別できないことがある
人間が区別を付けにくいという意味では
func_or_method FuncOrClassOrFh @arg;
540:デフォルトの名無しさん
08/02/26 15:03:13
あ
541:デフォルトの名無しさん
08/02/26 16:07:27
>>539
回答ありがとうございます。
一般的にパッケージ名に大文字を使うため、サブルーチンの名前にも大文字を使うと、
パッケージ名とサブルーチン名が重複する可能性があり、
重複するとコンパイラが区別ができないことがあるのかと、
疑問に思ってるのですが、これについてはどうでしょうか?
542:デフォルトの名無しさん
08/02/26 16:50:13
「名前空間」の勉強してこいよ
543:デフォルトの名無しさん
08/02/26 17:11:44
?
544:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/26 18:45:04
>>544
非常に分かりやすく解説してくださってありがとうございます。
URLリンク(perl.g.hatena.ne.jp)
こちらで書いてあるのは間違いということで、理解しました。
546:デフォルトの名無しさん
08/02/26 21:59:27
素人が趣味で書いたホームページを鵜呑みにされても・・・
547:デフォルトの名無しさん
08/02/26 23:18:46
何かあるのかと思って確認のために聞いただけじゃないか
548:デフォルトの名無しさん
08/02/27 10:27:01
素人かどうかなんてわからないだろ
549:デフォルトの名無しさん
08/02/27 10:28:24
わからないなら素人として扱うのが安全だろ
550:デフォルトの名無しさん
08/02/27 11:18:38
じゃあここでレスしてるのも素人ばっかりだなw
551:デフォルトの名無しさん
08/02/27 16:12:38
お前はその前提で喋ってればいいんじゃね?
馬鹿だなーって思われるだけだけど。
552:デフォルトの名無しさん
08/02/27 16:23:09
わかった。>>551は超素人ってことで。
553:デフォルトの名無しさん
08/02/27 16:42:13
笑うところだろw
まぁ鵜呑みにするな、っていうのは真理だな
554:デフォルトの名無しさん
08/02/27 22:22:22
素人です。教えてください。
何もわかりません。動きません。
絶対プログラムは正しいので、Perlのバグだと思うのです。
・・・・。
555:デフォルトの名無しさん
08/02/27 22:32:58
どっかのコピペか?
556:デフォルトの名無しさん
08/02/28 09:41:09
質問です。
func_hoge() というサブルーチンがあります。
このサブルーチンは、内部でエラーが起こった場合のみ、エラー番号やエラーメッセージを返してきます。
何も問題なければ 0 やら空文字列が返ってくるとします。
func_hoge()を呼び出すときは、
my $err = func_hoge();
if ($err) { die "Error func_hoge [$err]"; }
というように返り値を保持しておき、
エラーがあれば、その時のエラー番号(可能であればサブルーチン名などの目印も)を表示したい。
これはこれで全く問題ないのですが、func_hoge()の呼び出し箇所が増えると
エラー格納用の一時的な変数が増えてしまいますし、何より面倒です。
何か楽できる方法ありませんか?
557:デフォルトの名無しさん
08/02/28 11:00:53
func_hoge de die
558:デフォルトの名無しさん
08/02/28 11:13:37
func_hoge()の中でuse Carpしてcroakすればいいんじゃね?
die させないときはeval{}で囲えばいいし。
559:デフォルトの名無しさん
08/02/28 11:46:45
サブルーチンの中を弄らないと無理かー。
呼び出し側だけで何とか小手先の変更で出来ないかなとか考えてた。ありがとう。
560:デフォルトの名無しさん
08/02/28 12:41:38
ん?
push @err, func_hoge();
みたいなもんでいいのかな。
561:デフォルトの名無しさん
08/02/28 12:53:34
新しいサブルーチン作ればいいじゃん。
562:デフォルトの名無しさん
08/02/28 14:44:00
if (my $err=func_hoge()) { die "Error func_hoge [$err]"; }
563:デフォルトの名無しさん
08/02/28 22:13:15
>560
状況にもよるけど、サブルーチンを呼ぶたびにエラー判定しなきゃならないような類だと
結局手間は変わんないかも。
>561
最終的には多分そうなると思う。
>562
やっぱそれが一番スマートなのかなあ。
564:デフォルトの名無しさん
08/02/29 00:37:04
Perlってパースした後の構文木をプログラムで書き換えることはできないの?
565:デフォルトの名無しさん
08/02/29 03:20:56
dieで死ぬだけなら再利用しちゃえばいいんじゃないの?w
566:デフォルトの名無しさん
08/02/29 09:02:53
>>564
目的は?
567:デフォルトの名無しさん
08/02/29 10:51:40
Perl の localtime 関数はエポックからの秒数をローカル時刻の年月日に
分解してくれますね。これとは逆に、ローカル時刻の年月日を
エポックからの秒数に変換するにはどうしたらよろしいでしょうか?
568:デフォルトの名無しさん
08/02/29 11:05:27
timelocal
569:デフォルトの名無しさん
08/02/29 13:23:58
一度くらい自分で作ってみるのも悪くないけど(簡単だから)、
出来上がったらそれ以降は>>568を使っておけばいいな。
570:デフォルトの名無しさん
08/02/29 14:22:22
Perl で split 関数が返す配列を、一度配列に入れずに、すぐに配列参照として
受け取ることはできますか?
$ar = split(/,/, $str);
$ar_ref = \@ar;
じゃなくて
$ar_ref = split(/,/, $str);
のようにしたい。
↓こんなのじゃうまくいかなかった。
$ar_ref = \split(/,/, $str);
571:デフォルトの名無しさん
08/02/29 14:38:52
anonymous array reference constructor
572:デフォルトの名無しさん
08/02/29 14:43:44
>>571
つまり、こういうことですか?
$ar_ref = [ split(/,/, $str) ];
でも、これだと、配列の要素をコピーすることになりそうで (なりますよね?)
無駄ではありませんか?
573:デフォルトの名無しさん
08/02/29 14:45:55
>>572
実際の動作がどうなるのかはソースを読む。
読みたくないなら、明らかにコピーしそうなperlコードとBenchmarkで比較。
574:デフォルトの名無しさん
08/02/29 15:05:51
>>572
最適化されるよ。
575:デフォルトの名無しさん
08/02/29 16:29:22
>>574
証拠はある?
576:デフォルトの名無しさん
08/02/29 16:39:17
証拠がソースだったら読むのか?
577:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/29 17:00:25
>>575
証拠は俺の脳内。
信じられないなら自分でソース読もう。
579:デフォルトの名無しさん
08/02/29 17:54:31
>>577
void コンテキストで split 使うと @_ に入るので注意な。
580:デフォルトの名無しさん
08/02/29 19:05:26
lala-zコンテキストなら?
581:ジミー
08/02/29 21:41:12
$str = "a,b,";
@ar = split(/,\n/, $str);
print join(',', @ar);
これを実行すると a,b と表示されます。
つまり、split は末尾の空文字列を取り出してくれないようです。
末尾の空文字列を取り出して、このコードが a,b, と表示させるように
するための簡単な方法ってありませんかね。
(もちろん愚直に工夫すれば何とでもなるが、スマートな解がほしい)
582:ジミー
08/02/29 21:41:59
>581
コード間違えた。(実験してたコードにしてもた。)
× @ar = split(/,\n/, $str);
○ @ar = split(/,/, $str);
583:ジミー
08/02/29 21:46:48
解決した。
@ar = split(/,/, $str, -1);
ですね。
584:デフォルトの名無しさん
08/02/29 21:48:12
print join ',', split /,/, q/a,b,/, -1;
585:デフォルトの名無しさん
08/03/01 00:44:11
>>566
特にないけど、Perlならそういう面白いインターフェイスが用意されてそうだなと思ったまでで
586:デフォルトの名無しさん
08/03/01 01:06:48
麻雀なのに、娘とか嫁とか家族とかw
乞食は想像を絶するなw
587:デフォルトの名無しさん
08/03/01 01:07:14
スマン、誤爆
588:デフォルトの名無しさん
08/03/01 09:16:39
色々と妄想させてくれる。
世の中には「義妹が最強だろ」という誤爆レスが元になって作られたゲームとかあるからな。
人間の妄想力ってのは凄いもんだぜ。
589:デフォルトの名無しさん
08/03/02 10:27:48
おにぃちゃん、ヤメテ!
590:デフォルトの名無しさん
08/03/02 10:48:55
ヘッヘッヘ、いいじゃねぇか ポン ヘッヘッヘ
591:デフォルトの名無しさん
08/03/02 11:09:57
Active Perl 5.10.0 用の DBD-mysql ってどこにあるの?
592:デフォルトの名無しさん
08/03/02 11:48:26
>589-590
エロゲじゃねーよw
593:デフォルトの名無しさん
08/03/02 14:23:27
>>591
URLリンク(cpan.uwinnipeg.ca)
594:591
08/03/02 21:46:50
>>593
ありがとう。無事インストできたよん。
595:デフォルトの名無しさん
08/03/03 09:11:40
インスト
596:デフォルトの名無しさん
08/03/03 09:43:34
泣いても笑っても、お前のまんじゅうは無いよ。
597:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/03/03 16:49:12
すみません、補足です。
CGIにはインフォパスか引数で渡します。
<a href="hoge.cgi?$1">
こんな感じで。
599:デフォルトの名無しさん
08/03/03 17:31:00
サブルーチンに置換部分をまとめて、
$i =~ s/\[\[(.+?)\]\]/&url_enc($1)/eg;
600:デフォルトの名無しさん
08/03/03 17:58:47
そっか!e修飾子を利用した時は置換部分は関数以外は入れたらダメなんですね。
$i =~ s/\[\[(.+?)\]\]/<a href="&url_enc($1)">$1<\/a>/eg;
だとエラーが出るんで何でだろうとずっと思ってたんです。
ありがとうございます。勉強になりました。
601:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/03/03 18:40:50
>>601
すみません、
実はurl_encは誰かから教えてもらったもので丸写しなんです ^_^
でも今回のことでやっともろもろ判りました。
コード、参考になります(というかありがたくいただきます)。
ありがとうございます。
603:デフォルトの名無しさん
08/03/05 05:49:41
JavaのプログラムからCGIを実行しようとしたのですが、302エラーが返されます。
何故なんでしょうか?
604:デフォルトの名無しさん
08/03/05 10:21:39
>>603
302 はエラーじゃないし Perl の話でもない。
URLリンク(www.studyinghttp.net)
CGI: Common Gateway Interface part 13
スレリンク(php板)
605:デフォルトの名無しさん
08/03/05 10:22:39
Moved Temporarily
606:デフォルトの名無しさん
08/03/05 13:38:15
>>604-605
パーミッションの設定をしたら動きました;;
お騒がせしました
607:デフォルトの名無しさん
08/03/05 15:23:38
perlのuntil文っていらないと思うんですけど、皆さんどんなときに使ってますか?
608:デフォルトの名無しさん
08/03/05 16:30:42
使わなきゃいいじゃん
609:デフォルトの名無しさん
08/03/05 17:00:16
while (! hoge)よりも直感的に書ける場合もある気がする
とくに後置したときに英文っぽくておさまりがいいような
610:デフォルトの名無しさん
08/03/05 17:23:51
while ( !( ... || ... && ... || ...) )
とかになったらさすがに使うw
611:デフォルトの名無しさん
08/03/05 17:26:43
あー、あと成功したら0エラーならエラーの種類が1以上って関数が
成功したらとにかく実行って時とかに == 0 とかやらなくて済むとか。
612:デフォルトの名無しさん
08/03/05 18:07:48
>>609->>611
なるほど。参考になりました。
untilも使い道はいろいろあるんですね。
613:デフォルトの名無しさん
08/03/05 18:32:27
意味的に「〜になるまで続ける」って感じの時も until のがわかりやすいかも
614:デフォルトの名無しさん
08/03/05 18:37:39
>>613
確かに。これは考えたことなかったな。
615:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/03/06 12:16:11
>>615
ldの-Rオプションでバイナリに埋め込むのはどう?
617:デフォルトの名無しさん
08/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 した時点でエラーになります。
最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4963日前に更新/153 KB
担当:undef