1 :
デフォルトの名無しさん :
2005/11/06(日) 23:13:31 "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
リンク集は
>>2-3 過去スレは
>>4-5
前スレの埋め方、あれはないだろう?
斬新なアイデアでした
厨しかいないのかよ
11 :
デフォルトの名無しさん :2005/11/07(月) 11:51:39
「しかいない」には自分が含まれちゃうんだけど、 言葉に刺激が欲しくてつい言っちゃうんだよね、馬鹿はw
12 :
デフォルトの名無しさん :2005/11/07(月) 16:03:51
>>11 おいおい日本語大丈夫か・・・
空主語文に何いってんだが・・・
14 :
デフォルトの名無しさん :2005/11/07(月) 17:06:57
馬鹿は往生際も悪いな
15 :
デフォルトの名無しさん :2005/11/07(月) 18:01:02
日本語も碌に理解してない馬鹿が何いってんだか
16 :
デフォルトの名無しさん :2005/11/07(月) 19:22:42
つまらんことで頑張るね の割には、こじつけることもできなくなってるみたいだけど
上げてる奴はどう見ても全員荒らしです 本当にありがとうございました
お前ホントそれ好きだな、
perl6はperl5と互換性が無いと聞いたのですが、互換性とはどういった ことでしょうか?perl5で書いたソースが動かなくなるといった感じですか?
>>19 Perl 6は今世紀中にはでないから安心汁
そんなに後なの?
前スレはスレタイ間違えるし、 このスレは過去スレ貼り間違えるし同じ奴の仕業か? 一度ならず二度三度死ねよ能無しが。
Pugs使ってる香具師いる?
というかここ本スレで進めるわけ?
資源は大切にしようぜ
27 :
デフォルトの名無しさん :2005/11/08(火) 01:35:22
ここを本スレとします。
あと百年近く perl5 でいくわけか
perl -MCPAN -e shell
を実行すると
You have an empty /home/teppei/.cpan/sources/MIRRORED.BY,
I'm trying to fetch one
LWP not available
CPAN: Net::FTP loaded ok
Fetching with Net::FTP:
ftp://ftp.perl.org/pub/CPAN/MIRRORED.BY Timeout at /usr/lib/perl5/5.8/Net/FTP.pm line 503
でとまっちゃうよ
なんでだろ。
PASVじゃないのかな。
>>てっぺいさん 対象の鯖が死んでる可能性も。 cpan o conf init で再設定してみては。
久々にActivePerl 5.8.6から5.8.7にしたらアイコン変わってんのな
ああ。あのチンコみたいなやつだろ。 ぶっちゃけ金玉の方が良かった。
33 :
デフォルトの名無しさん :2005/11/08(火) 15:40:49
while (my $name = readdir(DIR)) { のようにした時、「0」という名前のファイルがあると $nameが"0"になるにも関わらず、whileが終了しないのは どうしてなのでしょうか?
perl -MO=Deparse すりゃ分かる
36 :
33 :2005/11/08(火) 16:13:10
>>34 ありがとうございます。納得しました。
>>35 終了しないので、試してみて下さい。
&abc($test); print %$test; sub abc { my($hash) = @_; $hash->{'DEF'} = '456'; } とする場合、"DEF456"と出力されればいいんですが、されません。 最初に $test->{'ABC'} = '123'; などと初期化しておけば良いのですが、この他にも初期化方法はありませんでしょうか
サブルーチン内でmyしたらルーチン終了後あぼーん。
39 :
37 :2005/11/08(火) 16:50:39
>>38 ハッシュリファレンスのアドレスを渡そうとしてるのですが・・
41 :
37 :2005/11/08(火) 16:56:02
>>40 どうもありがとうございます。
それでできました。
42 :
デフォルトの名無しさん :2005/11/08(火) 22:04:13
文字と数字がまざったデータのソート のやりかたが良く分かりません。 例えば、 「C100,D125,A12,A2,C5,D2」 と言うデータを 「A2,A12,C5,C100,D2,D125」 のようにソートしたいのですが、 数値の昇順、降順ソートである<=>を使用すると ソートされず(1文字目が文字だから?) 文字の昇順、降順ソートであるcmpを使用すると 「A12,A2,C100,C5,D125,D2」 とソートされます。(文字扱い) どうすれば良いのでしょうか・・
>>42 @example = qw( C100 D125 A12 A2 C5 D2 );
@sorted =
map { $_->[2] }
sort { $a->[0] cmp $b->[0] or $a->[1] <=> $b->[1] }
map { [/^(.)(.*)/ , $_] } @example;
後ろのmapの無名配列は [ "C", "100", "C100" ] みたいなデータになる
sort { ... } の ... の戻り値で入れ替えを判断するから1項目($a->[0] cmp $b->[0])が偽(=cmpで0=同値)だった場合orや||で次の判断基準を書く
基本的な構成は「シュワルツ変換」っての
44 :
デフォルトの名無しさん :2005/11/08(火) 23:26:36
文字列の一番最後の文字だけ削除する関数ってありますか? $foo = "bar"; func($foo); →$foo = "ba" # 一番最後のrを削除 $foo = "hoge hoge "; func($foo); →$foo = "hoge hoge" # 一番最後のスペースを削除 みたいな。
46 :
44 :2005/11/08(火) 23:49:29
chomp じゃなかたっけ?
両方あるよ 今回はchopが正解
>>36 readdirについても行入力演算子同様whileの条件の中で単独で使われたときの
暗黙のdefinedが有効になってるということだと思うけど、これについてマニュアルに
書いてありますかね? かなり探したけどみつけられなかった。
perlのGCを強制的に実行する方法はないでしょうか。 環境は ActivePerl 5.8.6 811 です。 今、threadsを使ったサーバを書いていて1クライアントごとに1スレッド割り当てています。 スレッド数は10までで制限をかけて、それを超える接続はキューに入れてまたせています。 同時に100クライアントが接続して来た場合に10スレッド平行で処理して、 クライアントとの通信が終了するとスレッドをjoinしているのですが、 メモリが開放されず、仮想メモリの使用量が1Gを超えてしまい困っています。 キューが空になってサーバが暇になるとメモリが一気に開放されているようです。 なんとかスレッドをjoinした時点でメモリを開放したいのですが、GCを動かす方法は ないでしょうか (sleepはだめでした)。 おとなしくselectを使って1スレッドで処理すべきなのかもしれませんが。
52 :
51 :2005/11/09(水) 22:23:54
>>52 スレッド開始前にlistenしておけば各スレッドでacceptできるけど、それじゃ駄目なの?
\12,345 のような金額の表記を数値にするにはどうしたらよいでしょうか?
>>55 $x = '\12,345';
$x =~ tr/0-9//cd;
ぐらいでいいんじゃ。trに慣れてなければs/\D//gでも可。
>>58 キミは、文字が読めないのかね???
> 未解決の問題
> 日本語を含むコンテンツを HTML::TreeBuilder で処理するには?
> 日本語部分が Unicode の文字実体参照に変換されてしまう.
> :
> as_text() メソッドでの出力は出来るようになった.as_HTML()
> を利用したり, 透過的に処理を行う方法がまだ分からない.
このサイトの作者の言によれば、非常に難しいことであることが解るだろう。
このスレで質問したところで、簡単に回答が得られるわけではない。
HTML::TreeBuilder を誰かが作り直すのを待つか、
キミがHTML::TreeBuilder を作り直すしかあるまい。
>>58 まともにutf8とかにしないで、日本語部分を適当に英数字のみをつかってエンコードしてから
食わせてやって出てくるものには逆変換かませばなんとかならんかね。
たとえば、eucに直してから0x80〜0xffの範囲を hoge<16進2ケタ> にするとかさ。hogeは
入力中にあらわれない文字列を適当に選んで。
そうすればHTML::TreeBuilderからはなんだかわからないけど長いスペルの英単語にしか見えない
はずなんで、あまり余計なことはされないんじゃないかと。
61 :
59 :2005/11/10(木) 15:15:53
>>60 それがいいかもね。こんな感じかな。
$str = '日本語テキスト';
print "オリジナル $str\n";
$str =~ s/[\p{Han}\p{InHiragana}\p{InKatakana}]/'hoge'.ord($&)/ge;
print "変換後 $str\n";
$str =~ s/hoge([0-9]+)/chr($1)/ge;
print "元に戻す $str\n";
しかし、[\p{Han}\p{InHiragana}\p{InKatakana}]のところは
何とかならんものかな。要するに、マルチバイト文字だけ変換
したいのだが。[^\p{Alphabet}]としてもうまく動いてくれないし。
>>61 別に、マルチバイト部分だけ変換でなくても全部変換でいいんじゃね?
全部 base64 してあとで全部元に戻すとかさ。
>>61 16進2ケタという元の案ならこんな感じ。
$str = '日本語テキスト';
print "オリジナル $str\n";
$str =~ s/([^\x00-\x7f])/sprintf "hoge%02x", ord($1)/ge;
print "変換後 $str\n";
$str =~ s/hoge([0-9a-f]{2})/chr(hex($1))/ge;
print "元に戻す $str\n";
>>62 htmlタグまで変換しちゃったら、パースできないんじゃないかと...
>>59 TreeBuilderのparseでエラーを吐くので、as_HTML()でなくas_text()すら不可能なんすよ。
ActivePerl 5.8.7なんだけど。
66 :
デフォルトの名無しさん :2005/11/10(木) 20:42:10
@_ = $a->b(); my $result = shift; をまとめて記述することは出来ないでしょうか? ハッシュの場合は警告が出るけど %{ $a->b() }->{hoge} で良いみたいなんですが。
$a->b() で、return wantarray ? array : scalar; で切り分けてあげると、 my $result = $a->b(); でよさそうな。。。
69 :
デフォルトの名無しさん :2005/11/10(木) 21:44:09
>>67 それだと$resultに配列の要素数が入ってしまいました
>>68 できました
>>66 (my $result,@_) = $a->b() は?
71 :
デフォルトの名無しさん :2005/11/10(木) 21:48:28
>>67 すみません、勘違いでした。
wantarrayは自分で設定するフラグじゃないんですね、それなら可能でした。
72 :
51 :2005/11/10(木) 23:10:23
>>53 おぉ、なんか目からうろこです。
ありがとうございます。明日早速試してみます。
初歩的な事ですみませんが、今まで気になっていた事がありまして。 スクリプト最後__END__前によく 1; って見かけるのですが、これは有っても無くても良い物ですか?
>73 モジュールやライブラリなら必須。 モジュールは、真と解釈される値を帰さなくちゃいけないから。 真と解釈されるものならなんでもいいんだけど、普通は1; 普通のプログラムなら無くても大丈夫だけど、俺はそんなの見たこと無いような気が。
require すると無いとエラー吐いたりする.
77 :
73 :2005/11/11(金) 12:17:15
ありがとうございます。 モジュール化してrequireしまくりたい感じなので おまじない的に書いておいた方が良い、という事でしょうか。 普通に文法として「1;」の意味が分からずエラーに見えて仕方なかったので気になっていました。
>モジュール化してrequireしまくりたい感じなので 外部スクリプトは全てモジュールだと思ってるなら間違いだから。
>>77 本来はエラーの有無を返すべきものだが、ほとんどの場合はサブルーチンや定数を
定義するだけでエラーなどでようもないので1;と書くだけのことが多い。
CPAN のインストールについての質問です。 ActivePerl + Cpan (windows2003 sarver)環境です perlは ActivePerl-5.8.3.809-MSWin32-x86.msi を使ってインストールしました。 その他、gzip unzip dmake ftp nctcp のパス及び設定を終えました。 perl -MCPAN -e shell の後、 install Bundle::CPAN を実行すると 幾つかのファイルをフェッチした後、 The bundle file ".\cpan\Bundle\CPAN.pm" may be a broken 。。。 このエラーで先より進めません。 解決策はあるでしょうか? どなたかご存知の方、ご教授頂けると幸いです
ppm
Catalystについて語られているスレはないかね?
84 :
デフォルトの名無しさん :2005/11/12(土) 23:39:30
Win XP + Active Perl 5.8.6を使っています。"え" という文字の ユニコードを10進で(すなわち"12360"と)表示させようとしているの ですが、下のルーチンではうまくいきません。どうすればよろしいでしょうか? use utf8; binmode STDOUT, ":encoding(cp932)"; binmode STDERR, ":encoding(cp932)"; binmode STDIN, ":encoding(cp932)"; use open IO => ":encoding(cp932)"; use Encode; $char = "え"; printf "%s = %d", $char, encode("utf16", "え");
85 :
84 :2005/11/12(土) 23:47:52
>>84 の最後の行間違えました。
(何れにしても正しい値が出ませんが)
printf "%s = %d", $char, ord(encode("utf16", $char));
>>84 use utf8してるのでスクリプトはutf8で保存されているとすると
$charにはじめからunicodeで”え"が入っているから
ord($char)
とするだけでいいのではないかと。
87 :
デフォルトの名無しさん :2005/11/13(日) 01:16:46
>>86 説明不足ですみません。utf16ユニコードの値が欲しかったのです。
しかし、自己解決できました。
# 特殊文字を2ちゃんねるに貼り付けるためのスクリプト。
my $str = "㋐㋑㋒㋓㋔";
$str =~ s/([^\x00-\x7f])/sprintf "%d;", conv($1)/ge;
print $str;
sub conv{
my $char = shift;
my $charv = encode("utf16", $char);
my $count = 0;
my $code = 0;
while(length $charv){
$byte = ord(chop $charv);
last if $byte == 0xff || $byte == 0xfe;
$code += $byte * 256 ** $count++;
}
return $code;
}
>>87 いやそれまわりくどいって。84のprint文を
printf "%s = %d", $char, ord($char);
って書き直してやるだけで結果は
え = 12360
だよ。
>> 84 printf "%s = %d", $char, encode("utf16", "え"); ↓ printf "%s = %d\n", $char, unpack "n", encode('utf16be', $char); なぜかordでできなかった。 encodingによる変換をutf16leにして、unpack "v" でも可。
90 :
デフォルトの名無しさん :2005/11/13(日) 03:40:27
ActivePerl 5.6を使ってます sub p { print $_[0]->{text}."\n" } my @test = ( {'text'=> 'hoge'}, {'text' => 'fuga'} ); p($_) foreach @test; #1 p($test[0]) #2 1の場合はサブルーチンpの中のprintが $_->{text} でもいけるのに どうして2の場合はキチンと[0]をつけてやらないといけないのでしょうか?
91 :
89 :2005/11/13(日) 04:11:30
>>88 ああ、perlfuncのordの項目にあるUnicodeってUTF-8フォーマットの
ことなのか。道理でutf16に変換したらうまくいかんわけだ。
92 :
デフォルトの名無しさん :2005/11/13(日) 04:19:38
>>90 > p($_) foreach @test; #1
> p($test[0]) #2
>
> 1の場合はサブルーチンpの中のprintが $_->{text} でもいけるのに
> どうして2の場合はキチンと[0]をつけてやらないといけないのでしょうか?
え? どう出来たら良いと思ってるの?
>>90 その関数だと、
p($test[0]) = p(@test)
94 :
デフォルトの名無しさん :2005/11/13(日) 05:59:52
>>92 引数はひとつであっても常に@_で送られるはずですよね、だから常に[0]をつけてやらないとダメじゃないかなとか思ってました。
省略できるケースは何なんだろうと思いまして。
質問です。 ハッシュに色々値を放り込むのと、必要な分だけ変数をこさえるのでは、速度とかメモリ使用の違いはあるのでしょうか。 perldocのデータ型読んでもいまいち分からなかったもので。
>>94 レキシカルな変数でなければ引数として渡さなくても同じ名前の変数が
サブルーチン側でも見えてるというだけの話じゃないか。$_と@_は全くの
別物。
>>95 あまりそういうことは考えずに素直に書いた方がいいと思うよ。
たいして儲からないのに見難くなるのがオチ。
>>97 ベンチ取るにもundef混ぜてやればいいのかよく分からないです。方法が間違っていればベンチとっても意味ないと思うし。
>>98 この場合はコードの見易さをとっていいって事ですか?
用途とか、使うときの意味でハッシュに纏めてたりするので、この使い方でいいのかな〜と疑問でした。
100 :
デフォルトの名無しさん :2005/11/13(日) 11:27:40
正規表現にマッチした個数を出す方法を教えてください
perlvar
違った
>>91 むしろ、Encodeの使い方とユニコードの事を間違えてる。
ユニコード,UCS-2,UCS-4とutf8,utf16の混同が一つ。
encodeの出力は単なるバイト列で、決してユニコードにならない事が一つ。
$utf8=encode('utf8',$unicode); # ユニコード文字列からUTF8バイト列に
$unicode=decode('utf8',$utf8); # UTF8バイト列からユニコード文字列に
例えば、"え"の場合length $unicodeは1でlength $utf8は3,
ord $unicodeは12360でord $utf8は227になる。
>>100 s/PATTERN/$&/g とか scalar(()=m/PATTERN/g) とか...
>>103 前者(s///g)は$&を使っても括弧と$1を使っても結局ものすごく遅くなるから、
後者(m//g)のほうがいいね。
別の書き方では、 $c++ while(m//g); とか?
105 :
デフォルトの名無しさん :2005/11/13(日) 15:29:59
>>103-104 ためしてみたけどうまくできませんでした
文字列中のabcの数を出したいんですが
$str="wwwabcabcrrrwww";
$str=~s/abc/$&/g;
print"$str";としてもだめでした。
106 :
91 :2005/11/13(日) 16:24:38
>>103 突っ込みサンクス。
勘違いしてますた。ところでPerlのソース見ると、
Unicodeって云ってる文字列はUTF-8みたいだけど?
文字列の長さがどうのは、utfフラグがついてるかどうかの
問題だと思うんだがどうだろう。
107 :
デフォルトの名無しさん :2005/11/13(日) 18:46:32
文字列1の中に文字列2が含まれている個数を出す関数を自分で考えました $aaa=&match_kosuu("aaaaaaaaあああaaaaaaaaああああaaa","aaa"); print "aaaの個数=$aaa"; sub match_kosuu{ local($aaa)=0; local($str); $str=$_[0]; $str=~s/$_[1]//g; $www=length($str); $aaa=(length($_[0])-$www)/length($_[1]); return($aaa); }
>>107 $kosuu = () = "aaaaaaaaあああaaaaaaaaああああaaa" =~ /aaa/g;
printf "aaaの個数=$kosuu\n";
このスレレベル低杉
質問です。ビット演算子を文字列に対して行うという話ですが、 例えば "123.45" & "67.89" という演算をしたとしても、文字があらわす数字とは何の関係もなく 文字コードのビット配列で計算してしまうのですよね? 文字列のビット演算の使いどころがわからないのですが、 どういうときに役に立ちますか?
pack, unpackが出てくるようなとき?
113 :
デフォルトの名無しさん :2005/11/14(月) 01:15:30
>>111 > 質問です。ビット演算子を文字列に対して行うという話ですが、
ビットベクタは事実上文字列という話じゃなくて?
>>111 >どういうときに役に立ちますか?
小文字を大文字に変換する最速の方法として使えるかもしれんな。
$foo = "abcdef" & "______";# ABCDEF
>>113 >>108 の通りでちゃんと動いたよ。
ヒント:ファイルの文字コード
値3.987899の小数部分987899を無視して、 3として計算に使いたいんですが、どうすればいいですか?
>>115 環境にも依存する可能性はあるが、手元じゃucの方が速いよ。
use Benchmark;
my $s = "abcdef";
timethese(undef,
{
bitand => sub { $foo = $s & "______"; },
uc => sub { $foo = uc $s; },
}
);
結果:
Benchmark: running bitand, uc for at least 3 CPU seconds...
bitand: 4 wallclock secs ( 3.18 usr + 0.00 sys = 3.18 CPU) @ 1126669.50/s (n=3582809)
uc: 4 wallclock secs ( 3.15 usr + 0.04 sys = 3.19 CPU) @ 1647269.91/s (n=5254791)
>>117 int(3.987899)
>>115 固定長だと話にならんので、文字列長を求めるようにしたらこうなった。
use Benchmark;
my $s = "abcdef";
timethese(undef,
{
bitand => sub { $foo = $s & (length($s) x "_"); },
bitandfix => sub { $foo = $s & "______"; },
uc => sub { $foo = uc $s; },
}
);
Benchmark: running bitand, bitandfix, uc for at least 3 CPU seconds...
bitand: 2 wallclock secs ( 3.02 usr + 0.00 sys = 3.02 CPU) @ 2174994.70/s (n=6568484)
bitandfix: 2 wallclock secs ( 3.05 usr + 0.01 sys = 3.06 CPU) @ 3427579.08/s (n=10488392)
uc: 4 wallclock secs ( 3.01 usr + 0.02 sys = 3.03 CPU) @ 4279167.66/s (n=12965878)
>>119 それは、処理前の文の解釈の時間が相対的に大きくなっているだけ。
実際に処理が始まれば、ビット演算のほうが速いことは、文字列を長くすれば解る。
なお、$cpは$sより長くても支障は無いから、最初に充分な長さを確保しておけばよい。
use Benchmark;
my $s = "abcdef"*1000;
my $cp = "_" x 100000;
timethese(undef,
{
bitand => sub { $foo = $s & (length($s) x "_"); },
bitandfix => sub { $foo = $s & $cp; },
uc => sub { $foo = uc $s; },
}
);
Benchmark: running bitand, bitandfix, uc for at least 3 CPU seconds...
bitand: 4 wallclock secs ( 3.08 usr + 0.00 sys = 3.08 CPU) @ 1209622.81/s
(n=3723219)
bitandfix: 3 wallclock secs ( 3.03 usr + 0.00 sys = 3.03 CPU) @ 6406829.76/s
(n=19419101)
uc: 3 wallclock secs ( 3.00 usr + 0.00 sys = 3.00 CPU) @ 4357491.50/s
(n=13076832)
げげ。間違えた。orz >my $s = "abcdef"*1000; my $s = "abcdef" x 1000; しかし、結果はより鮮明になった。 Benchmark: running bitand, bitandfix, uc for at least 3 CPU seconds... bitand: 4 wallclock secs ( 3.06 usr + 0.00 sys = 3.06 CPU) @ 1436996.74/s (n=4401521) bitandfix: 2 wallclock secs ( 3.16 usr + 0.00 sys = 3.16 CPU) @ 149609.32/s (n=472167) uc: 3 wallclock secs ( 3.20 usr + 0.00 sys = 3.20 CPU) @ 43495.47/s ( n=139316)
へー、文字列が長くなると逆転するのか。勉強になった.
perl-CGIスクリプト書いて遊んでるんだが OSをwin2000sp4からWinXPに変えたら動作がえらい遅くなった(それ以外の環境は一緒)。 そんなにOSの差ってあるもんすか?
「-w」オプションをつけると わざと「$dummy」とかに値を捨てたときにも 「used only once: possible typo」 と出てしまうのですがエラーを出さなくする方法はあるのでしょうか? よろしくお願いします。
スコープ宣言する。
>>125 ・要らない値を作らないようにする my($sec, $min, $hour) = (localtime)[3,4,5];
・undef に捨てる my(undef, undef, $foo) = bar();
・$dummy を二回以上使う
128 :
125 :2005/11/14(月) 16:21:27
>>127 『undef に捨てる』
を使いました。ありがとうございます。
129 :
デフォルトの名無しさん :2005/11/14(月) 16:53:16
>>129 sendmail のマニュアルと RFC 2822 を読めばいいと思うよ。
何にしろ Perl の話じゃないので次の質問は適切なスレへ移動して下さい。
131 :
103 :2005/11/14(月) 18:51:30
>>104 それ(ループを回して数える)が適当かと。
前者(s///g)はリードオンリー値でエラーを出すので後者の方がマシだけど、
後者(m//g)も一時的に配列を作るから。
>>105 =~はパターン結合演算子。結果の入手は代入演算子。
>>106 そのとおり。utfフラグがUnicodeか否かを決定してる。
Unicodeだと文字コードの範囲が0〜0x7FFFFFFFになり、全ての文字幅が1になる。
少なくともそう見えるようになる。不完全だけどね。
132 :
111 :2005/11/14(月) 19:53:17
レスどうもです。
>>114 ビットベクタという言葉は知りませんでした・・・
>>115 そういう方法があったんですね。しかし逆に言うとそのぐらい
しか使い道なさそうですね。
ラクダ本第3版を買おうか迷っているのですが、今買い時ですかね? ラクダ本は今回が初めての購入です。すぐに第4版出ると悔しいので。 たかだか5.6→5.8の差分ぐらいで新しい版は出ないですよね?
134 :
デフォルトの名無しさん :2005/11/14(月) 20:22:52
要素が10個あるとして、1つのページに1個ずつ 1 2 3 4 5 >> というふうに要素を表示させたいのですが、どのようにすればいいですか? foreach $data (@log) { なんたらかんたら $count++ } 見たいな感じでまわした後の$countの使い方がわかりません。。
>>133 持ってないなら買うべし。ただ 5.6 → 5.8 の差は決して小さくないので、
自分の使っているヴァージョンの perldoc も併読する事が肝要。
>>133 気になるならアマゾンでユーズド買うとか。
海外でもまだ第3版だからすぐには出ないはず。
137 :
133 :2005/11/14(月) 21:23:05
レスどうもです。ど〜んと買うことにしました。 会社が買ってくれりゃ良かったのですが;;
>>134 みんな意地悪で君にレス付けないわけじゃないからな。
意味がわからないだけだからな。
print $_ for 0..$#log; というような話なのかなぁ〜
Perlってダブルクォート文字列内で、変数とか展開できるですよね。 なら、文字列連結演算子っているの?という疑問がわいてきませんか? $a = "abc"; $b = "def"; $renketu = "$a$b";
>>141 >>1 "There's more than one way to do it"
>>141 文字列連結演算子があれば、
$a .= $b;
みたいなのができる。strcat
$a = "$a$b";
は、"$a$b"を生成してから、$aにstrcpy
>>141 $renketu = $a . kansuu() . 'ghi' x 3 . (my $b = 'def');
ダブルクウォート内は、暗黙に文字列連結演算子が使われてる。
基本的ですみませんが、 my と local は全く同じと考えてよいのでしょうか?
148 :
141 :2005/11/14(月) 22:37:20
レスどもです なるほどねぇ なるほどなるほど
150 :
デフォルトの名無しさん :2005/11/15(火) 00:31:55
>>138 Σ(・∀・;)
日本語が通じなくてシカトされていたとは・・・
しばらく日本語研修に行って参ります。ノシ
そうじゃなくて説明しなおせよw
152 :
134 :2005/11/15(火) 01:47:29
>>151 説明しなおします。
つまり、
ヤフなどの検索エンジンの検索結果のように、
表示すべき内容がたくさんあった時、
いっそのこと1ページに表示する件数を決めて、
複数ページに分けて表示させてしまおうではないか、
という話です。
このように、文節をとにかく繋げてしまう私は日本語力が乏しr(ry
>>152 ページ番号が0のとき、 1〜10までを表示
ページ番号が1のとき、11〜20までを表示
・・・
ページ番号が$nのとき、($n*10+1)〜(($n+1)*10)までを表示
って作ればいい。
HTML::Pager つうモジュールがあるな。つこたことないけど。
>>152 CGIと一言も言ってないけどCGIでしょ?
続けるならWebProg行きなよ
156 :
134 :2005/11/15(火) 06:58:28
157 :
134 :2005/11/15(火) 06:59:37
>>157 おまい、いろいろ不自由なんだな・・・
ガンガレ
159 :
デフォルトの名無しさん :2005/11/15(火) 14:15:26
>>130 レスありがとうございます。Sendmailの本は持っているのですが、よく分かりませんでした。
適切なスレを探しているのですが、よく分かりません。もしよければ、質問できそうなスレを教えて貰えませんか?
>>159 いや、sendmail本はともかく RFCの確認含めて、基礎的な部分を自分で
調べられない程力不足であれば、人に聞くだけでは怪しいままなので
そういう他のサイトに被害が及びそうなことはやめてくれよ。
ちょっと質問してなんとかなるレベルの人ではなさそうだから まじめにじっくり勉強しろという方が親切だろうな...
perlの勉強をしようと思っています。 AN HTTPDで鯖を立て、そこにプログラムを置いて実行するようにしたのですが、動きません。 一瞬読みに行ったような動作はするのですがすぐに終わり、何も変化しません。 詳しい先輩に聞いたら「perlがぶっこわれてんじゃね」といわれたため、入れなおしてみたりいろいろしてみましたが変化ありません。 なぜでしょうか?非常に困っているために解決方法を教えていただきたいのですが・・・ AN HTTPDのver 1.42n Active Perlのver v5.8.7 built AN HTTPDの設定 拡張子.pl,.cgi 実行プログラムC:\Perl\bin\perl.exe よろしくお願いします。
>>163 それ、Perl の質問じゃないんじゃないの?
>>164 すみませんでした。別のところいってきまつ
myで宣言した変数って、いらなくなったらundefしたほうがいいの?
168 :
デフォルトの名無しさん :2005/11/15(火) 20:10:17
>>167 > myで宣言した変数って、いらなくなったらundefしたほうがいいの?
時と場合による。
169 :
デフォルトの名無しさん :2005/11/15(火) 20:17:29
``でsmbclientを呼び出してwin-unix間でファイル転送するスクリプト書いています。 smbclientが実行される度にコンソールに標準出力が出るのですが、これを表示しないようにすることは可能ですか?
use strice プラグマについて教えてほしいのですが、 これを指定すると、変数はすべて宣言しなければならないと いう規制がつきますよね? 宣言とはmyを付けることなのでしょうか? それにしては、いきなり $a = "aaa"; とか書いても怒られないんですよね。 どういう解釈をすればいいのでしょうか?
>>171 $a と $b だけは特別。 perldoc perlvar 参照。
>>167 my な変数はできるだけ内側のスコープで宣言しておいて、「要らなくなった時には見えなくなっている」というのがひとつの理想かと思う。
そういう話でなかったらごめん。
>>168 > > myで宣言した変数って、いらなくなったらundefしたほうがいいの?
> 時と場合による。
っていうか、そういうことをするのは相当特殊な場合でしょう。
myな変数をundefしたとして、その場でメモリって解放されたっけ? もうPerl忘れたぞ。。 スコープを抜けた時にリファレンスカウンタ調べて解放して行くと記憶してるけど
逆にlocalやourで宣言した変数って 決して解放されないって考えた方がよいの?
>>177 シンボルテーブルにエントリは残るけど
アロケートしたメモリはundefすれば解放されるんじゃねーの
>>177 いや、それもスコープ抜けたときだったと思う。
ちょっと見てみたけど手元の黒豹本では、
リファレウンスカウントがデクリメントされるのは、
When variables (named values) go out of scope,
とある。
この黒豹本、初版で古いけど、今は違うなんて事はないよね。
「変数」を開放?
{ my $hoge = 'This is hoge.'; … } # 今や$hogeは解放された。× # 今や$hogeは消滅した。 × # 今や$hogeは逝ってしまった。 ○
182 :
171 :2005/11/15(火) 23:05:35
>>172 レスありがとうございます。
なんと、予想もしなかった言語使用にひっかかっていたんですね。
>>181 それはプールに戻ったという意味だよね。
その昔、Cで拡張ラリブラリ書いた時に
DESTROYで強制的にメモリ解放させるのは書いた事があるが。
そうじゃなきゃプールに戻るんだったような。
184 :
銀色 :2005/11/15(火) 23:09:28
質問させてください。 テキストファイルの処理をしているのですが、 多少の加工をした後に重複した行を削除したいのです。 何かいい方法ありませんでしょうか?
意味が分かりません
186 :
銀色 :2005/11/15(火) 23:17:44
すみません。 ただ単に重複した行を削除したいと言うことです。 $txt の中に \n で改行されています。 うん。相変わらず説明が下手です。ごめんなさい。
適当に連想配列にぶち込んでは如何でしょうか
結局解放されたメモリオブジェクトって OSに返却されないまでも Perlのプロセス内では再利用されているって 信じちゃっていいんでしょ?! 信じちゃうから。
>>188 そういうこと言ってると「malloc() & free()」っていうタイトルで長大なスレッドが・・・
>>186 調べる力も身に付けようね。
my %got;
foreach (split /^/, $txt) {
print unless $got{$_}++;
}
191 :
134 :2005/11/16(水) 00:55:24
>>185 さん
僕と
>>184 さんのどちらの方が意味不明ですか?
と、競ってみたりします。
ところで、みなさんはperlとcのどちらが使い勝手が良いと考えていますか?
そういうくだらないことなんか気にせずどんどん書け。 それがスクリプトクォリティだろ。
マジ良いスレ
>>191 ちょうどPerlとCしか使わない(使えない)人間なんだけど
使い勝手って言ったらそりゃPerlでしょ。用途がぜんぜん違うから
比べるのは間違ってるけどね。
>>149 ほー 興味深いなぁ。 今まで my と local 適当に使ってた(´・ェ・`)
この説明は、要はこういうことなのかな。
■local は、グローバルの同名(?)変数の内容を待避させ(スタック?)、再利用する。
スコープから外れると、使用していたのを破棄して、待避内容を復帰させる。
■my は、スコープ内で呼ばれると用意されるメモリ空間?
コンパイル時とは言っても、cのstaticとは違うんですよね? package内グローバルだと
staticっぽいですね。
ちょっとちがうかなぁ。
まとめると、大きい変数使ったりスピード求めるには、 my の方がいいのかな?
196 :
デフォルトの名無しさん :2005/11/16(水) 09:08:26
すごい適当なまとめですね
>>195 > 大きい変数使ったりスピード求めるには、 my の方がいいのかな?
つか、そもそも用途が全然違うだろ。馬鹿か?
199 :
195 :2005/11/16(水) 09:49:04
>>197 ファイル丸飲みして処理を完結する関数の場合あてはまるんじゃねーか? 馬鹿か?
200 :
195 :2005/11/16(水) 09:52:00
>>199 全然当てはまんない。だから、そもそも用途が違うって。入門書読め。
202 :
195 :2005/11/16(水) 14:35:25
localはグローバル変数の局所化の宣言。 そりゃ、スコープを抜ければ待避させたデータの再利用が可能だし、 入門書では他のサブルーチンからでも参照できるとか書いてるけど 意図的にそういうスクリプト書く奴の気が知れない。 基本はTMTOWTDIだが、一応正しい使い方はlocalでできてmyでできない宣言。 →型グロブやファイルハンドルの宣言、特殊変数の一時書き換えなど。 myはレキシカル変数の宣言。 スコープの外からリファレンスを使って参照することができるが、基本的にはスコープを抜けると消える。 外から参照されている場合もリファレンス自体が消えた時点で消える。 スコープの外に同名の変数が無く、リファレンス等も用いていないなら挙動は同じといって良い。 きっちり書いてるならundefする必要はないと思われ。 undefされた変数をそれ以降に利用する場合とかはその例外。 これでどう?
ちなみに初心者がグローバル変数だと思っているのはmain::パッケージのパッケージ変数。
今、入力ファイルが引数またはSTDINで処理しようとしています。 script.pl inputfile script.pl < inputfile # script if ( $ARGV[0] eq "" ) { $fh = *STDIN; $f_flag = 0; } else { open IN, $IN; $fh = *IN; $f_flag = 1; } while(<$fh>){ 処理 } $f_flag = 1 なら閉じる としているのですが どちらもやりわすれたときの良い対処方法が見つかりません。 どのようにしたらいいでしょうか?
> どちらもやりわすれたときの良い対処方法が見つかりません。 これが意味不明なのでなんとも回答のしようがないな。 「どちらもやりわすれた」って何? それ以前の一般的な話として、 openはよく失敗するので戻り値見るべき 単に標準入力か引数のファイルを読みたいだけなら<>でもいいんじゃねーの?
あとひとつ。コマンド引数の有無を調べるのは$ARGV[0] eq ''より @ARGV == 0の方がいいと思う。
確かに意味不明でした。修正します。 今、入力ファイルが引数またはSTDINで処理しようとしています。 使用法A:script.pl inputfile 使用法B:script.pl < inputfile # script if ( @ARGV[0] eq 0 ) { $fh = *STDIN; $f_flag = 0; } else { open IN, $ARGV[0] || die "I can't open"; $fh = *IN; $f_flag = 1; } while(<$fh>){ 処理 } $f_flag = 1 なら閉じる としているのですが 使用法Aも使わず使用法Bも使わなかった時の良い対処方法が見つかりません。 どのようにしたらいいでしょうか? >単に標準入力か引数のファイルを読みたいだけなら<>でもいいんじゃねーの? これは知りませんでした。 今、試しましたがやっぱり使用法AもBもしなかったときは 自動的にスクリプトが終了しないですよね? どうしたらよいのでしょうか?
つ 「使い方をどちらかに統一する」 使用法B:script.pl < inputfile これって、inputfileがなければ入力待ちになるからなぁ。 どうしてもって言うなら、 一定時間入力が来なかった場合、timeoutさせるようにする。
>>208 標準入力をredirectしてなければ端末がつながってるので
そういうものだな。それがredirectの結果つながったものか
どうかは起動されたプログラム側からはわからないので、
ある程度誤判定をするのを覚悟してファイルの種類で
区別するしかないんじゃないだろうか。-f STDINや
-c STDINあたり。
>>208 入力を大文字化して表示するスクリプトの例。
#!/usr/local/bin/perl -w
my $input = shift @ARGV or die "Not enough arg.\n";
open IN, '<' . $input or die $!;
print uc while <IN>;
__END__
標準入力を使いたい場合は
script.pl -
のように - を指定。
>>210 入力が端末かどうかテストすればええのでは? -t fileno(STDIN) あたり。
cat で来たら分からんなぁ
214 :
デフォルトの名無しさん :2005/11/16(水) 18:15:59
$hoge[0]=('a'=>5,'f'=>9,'k'=>8,'d'=>12); $hoge[1]=('i'=>6,'c'=>2,'g'=>7); $hoge[2]=('e'=>4,'l'=>3,'b'=>10,'h'=>11,'j'=>13); 上記のような配列@hoge(要素数100以上)があったとして $hoge[20]〜$hoge[30]までを切り取って上位に詰める(unshift?) する場合は、どうしたら良いのでしょうか? 現在は、下記のようにしていますが、もっとスマートな方法は ありますか? for($i=0,$j=0;$i<@hoge;$i++) { if($i>=20&&$i<=30) { foreach $key (keys %{$hoge[$i]}) { $tmp[$j]{$key} = $hoge[$i]{$key}; } $j++; } } for($i=0;$i<@hoge;$i++,$j++) { if($i<20&&$i>30) { foreach $key (keys %{$hoge[$i]}) { $tmp[$j]{$key} = $hoge[$i]{$key}; } $j++; } }
>>214 ちゃんと読んでないけど
splice()
もうちょっと書こうか、相変わらず元のスクリプト読んでないけど、 splice(@hoge, 20, 10); じゃなかったかな。間違ってたらすまん。
217 :
214 :2005/11/16(水) 18:44:45
>>215-216 spliceは、配列に場所を指定して配列を追加したりする時に
使いますよね?でも、この場合は、$hoge[20]〜$hoge[30]まで
を上位に"Copy"では無く"Move"させたいのです。
その場合に元の位置にあったデータは消したいのですが…。
どうすれば良いのでしょうか?
>>214 「上位」って何?
俺用語を使わないで、正しい言葉と、分かりやすいサンプルを。
220 :
212 :2005/11/16(水) 18:57:48
試しに書いてみた。 close するのめんどいので FileHandle 。 # script use FileHandle; { my $fh = (@ARGV == 0) ? *STDIN : new FileHandle $ARGV[0]; die "Can't open" unless defined($fh); die "Can't input from terminal" if -t fileno $fh; while(<$fh>){ printf ">>> %s", $_; } undef $fh; };
>>217 ひょっとしてこういう事か?
$hoge[$from] から $hoge[$to] として、
@hoge = (0 .. 40);
$d = $to - $from; # 30 - 20
splice(@hoge, $d, $d); # splice(@hoge, 30 - 20, 10);
222 :
221 :2005/11/16(水) 19:14:49
ごめん間違えた。こうか。 @hoge = (0 .. 40); $d = $to - $from; # 30 - 20 splice(@hoge, $from - $d, $d); # splice(@hoge, 20 - (30 - 20), 10);
>>221-222 もちつけ、splice(@hoge, $from, $d); # splice(@hoge, 20, 30 - 20); じゃないか?
# これじゃ削除だけだけど
>>214 質問の件はspliceで出来るだろうからちょっとツッコミを。
Perlでの擬似多次元配列は無名配列/無名ハッシュを用いて実現されている。
http://www.kt.rim.or.jp/~kbk/perl5.005/perlref.html > $hoge[0]=('a'=>5,'f'=>9,'k'=>8,'d'=>12);
これは正しくはこう書く
$hoge[0]={'a'=>5,'f'=>9,'k'=>8,'d'=>12};
で、これを読めば分かるように$hoge[$i]の中身はリファレンスなので、
foreach $key (keys %{$hoge[$i]}) {
$tmp[$j]{$key} = $hoge[$i]{$key};
}
ここは、この場合必要としてるのは浅いコピーだから、
$tmp[$j]=$hoge[$i]とリファレンスをコピーしてやれば十分
効率は悪いが、@hoge[0..30]=(@hoge[20..30],@hoge[0..19]); という手もあるね。
>>219 ごめんなさいspliceの機能を勘違いしてました。
>>221-222 解答ありがとうございました。
unshift @array, splice @array, 20, 10;
で解決しました。
>>223 色々と為になるご掲示ありがとうございます。
勉強になります。浅いコピーは一発で代入できるんですね。
という事は深いコピー…例えば、#hoge[100][100]{$key}のような
構造の配列では$tmp[$j]=$hoge[$i]とできないという事ですか?
226 :
デフォルトの名無しさん :2005/11/16(水) 19:48:13
>>225 > という事は深いコピー…例えば、#hoge[100][100]{$key}のような
> 構造の配列では$tmp[$j]=$hoge[$i]とできないという事ですか?
っていうか、それだと浅いコピーです。
>>225 深いコピーというのは同じものを参照するのではなく、別の写像を作ることを言う。
今回のようにした場合、
$hoge = {'a' => 1};
$fuga = $hoge;
$fuga->{a}='2';
とコピーした先を書き換えると、$hoge->{a}も書き換わってしまう。
$hoge = {'a' => 1};
$fuga = {};
%$fuga = %$hoge;
$fuga->{a}='2';
という風に深いコピーをしてやれば、$hoge->{a}は変わらない。
が、別の領域を用意するということはメモリを余分に使うということであり
必要が無いならやるべきではないな。
228 :
デフォルトの名無しさん :2005/11/16(水) 19:56:04
ディープコピーをするのだと、Cloneというモジュールがあるね。
229 :
227 :2005/11/16(水) 20:02:15
>>227 ああ、言い忘れたけれど
$hoge = {'a' => [1,2,3]};
みたいになると
%$fuga = %$hoge;
じゃ[1,2,3]の部分までは深いコピーは出来ないな。
そういう場合は
>>228 の言っているCloneモジュールを使うべきかな
>>225 > という事は深いコピー…例えば、#hoge[100][100]{$key}のような
> 構造の配列では$tmp[$j]=$hoge[$i]とできないという事ですか?
やりたいことにもよるけど、浅いコピーが出来ないのかと訊かれれば、出来ると答える
spliceって何て読むの? スプライス? いつも口に出す時こまる。
233 :
221 :2005/11/16(水) 20:21:53
スプリス
236 :
デフォルトの名無しさん :2005/11/16(水) 20:57:12
@hoge=(0,0, ... ,0)とx個0の入った配列を作りたいです。 for文使うのが普通ですか?
>>236 演算子のxを使う
@hoge = (0) x 100;
238 :
デフォルトの名無しさん :2005/11/16(水) 21:16:43
239 :
デフォルトの名無しさん :2005/11/16(水) 21:52:30
配列の要素がすべて1なら真を、そうでなければ偽を返したいです。 for文を使うのが普通でしょうか? (例)@hoge=(1,1,1,1,1,1)なら真、@huga=(1,0,1,1,1)なら偽
240 :
デフォルトの名無しさん :2005/11/16(水) 21:57:59
sub subete_ichi { return scalar(grep($_ != 1, @_)) == 0 ? 0 : 1; }
241 :
デフォルトの名無しさん :2005/11/16(水) 22:02:59
ごめん逆だった sub subete_ichi { return scalar(grep($_ != 1, @_)) == 0 ? 1 : 0; }
>>239-241 全部調べなくても一つ違えばそこで調べ終わっていい。
sub check { $_ == 1 || return for @_ }
243 :
242 :2005/11/16(水) 22:10:19
あー。 sub check { $_ == 1 || return for @_; 1 }
一応言いたい事があったので言っとくと 無理に短い、トリッキーなコードを書こうとしないで 後にメンテする人の事も考えてあげて下さい(><)
何を言ってるんだお前は
これをトリッキーと言ってるような香具師にコードのメンテさせたくはない。
247 :
デフォルトの名無しさん :2005/11/16(水) 22:27:20
if (@hoge==(1,,1)) みたいなわかりやすい書き方ないのかなぁ。
これ以上構文糖を増やさんといてください
249 :
銀色 :2005/11/16(水) 22:31:04
>>190 適当なところにそのまんまその4行を追加してみたけどダメでした。
3分考えて
open(FILE, ">$filename") or die;
#print FILE $txt;
my %got;
foreach (split /^/, $txt) {
print FILE unless $got{$_}++;
}
close(FILE);
こうしたらうまくできました。
調べる力の不足もそうですが、それ以前の理解度の不足が…
ちょっとずつ勉強していくのでその時はよろしくです。
253 :
デフォルトの名無しさん :2005/11/16(水) 22:45:15
254 :
250 :2005/11/16(水) 23:09:26
自分で紹介しといて言うのもなんだけれど、ちゃんと見てみると面白いなこれ all(@arr) == any(1,2,3,4) で@arr[のすべて]が1,2,3,4[のどれか]なら、とかもできるのか # 役に立ちそうだったからとりあえずブックマークしてあった
むしろ、メンテのことやトリッキーなコードを気に するような奴がPerlを使うなと言いたい そういう人はPythonとJavaを使いなさい
ていうか全然トリッキーじゃないから、この場合。
257 :
169 :2005/11/16(水) 23:28:36
>170 返事遅くなりましたが、`smbclient 2>&1`で解決しました。 ありがとうございました。
>>239 > 配列の要素がすべて1なら真を、そうでなければ偽を返したいです。
> for文を使うのが普通でしょうか?
> (例)@hoge=(1,1,1,1,1,1)なら真、@huga=(1,0,1,1,1)なら偽
List::MoreUtilsに。
>>258 all { $_ == 1 } @hoge;
か。
perlマスターになるにはラクダ本を通し読みせにゃ ならんのですかね。今はリファレンスに使っていますが。 全部読んだって人います?
あれ読んでもマスター出来ない とにかく人の書いたソースを読みまくること
>>260 全部読んで Perl マスターになったひともいるだろうが、
全部読まずとも Perl マスターになったひとも大勢いるだろう。
赤ラクダは全部読んだ。本が壊れるまで。
>>239 > 配列の要素がすべて1なら真を、そうでなければ偽を返したいです。
> for文を使うのが普通でしょうか?
> (例)@hoge=(1,1,1,1,1,1)なら真、@huga=(1,0,1,1,1)なら偽
eval(join('==1 && ', @hoge).'==1')? return "1": return "0";
ぼくはさんこうえんざんしがとおってもだいきらいです
>>264 なんというか・・・突っ込みどころ満載だな・・・
わざとじゃなかったら、すごいな。 !index(join('', @hoge), 0);
>>244 の気にすべきはこういうコードだ、っていう見本でしょう。
>>267 志村ー-1、-1
$tmp+=$_ foreach @hoge; return $tmp==@hoge
お、久々に良く伸びてるな。
271 :
デフォルトの名無しさん :2005/11/17(木) 05:10:06
s/置換したい文字列/条件式1つめ ? 条件にあってたら: あってなかったら; それをさらに条件式にかけて ? 条件にあってたら: あってなかったら/e みたいなことをしたいんですけど、どう表現すればいいですか? (上の文ではうまくいかないみたいです。)
>>271 漏れの解釈どおりなら、それでちゃんと動く。
こういうことだと解釈したけれど、違うならもっと具体的に説明を
my $hoge = 'xxx#a#xxx#b#xxx';
$hoge =~ s{#(.*?)#}
{
my $tmp = $1 eq 'a' ? 'hoge' : 'fuga';
$tmp =~ /ho/ ? 'foo' : 'bar'
}eg;
print $hoge;
>>203 分かりやすい。ありがとう。
外から参照されてないと消えるってのは知らなかった。
にしてもよく伸びるスレだな。。。
275 :
203 :2005/11/17(木) 19:48:58
>>274 いや、消えてくれないとmyの意味ないから。
俺もずっと放置されていて寂しかったよ・・・
レスしてくれて報われた気がする。サンクス
rubyでいうところの % ruby -e 'print [1,2,3,4,5].reverse[0..2], "\n"' をやりたいのですが、 % perl -e 'print reverse(1,2,3,4,5)[0..2], "\n"' で怒られてしまいます。 何かナイスな書き方ってありますか?
>>276 % perl -e 'print +(reverse(1,2,3,4,5))[0..2], "\n"'
このスレ回答早杉ww何人常駐してるんだよw
280 :
デフォルトの名無しさん :2005/11/17(木) 21:14:48
大きなファイルを 1 行ずつ読み込んで処理をしているのですが、 結構時間がかかるので "." をポチポチと画面に表示していこうと 考えました。 とりあえず 500 件毎に "." を出力して、50 個出力したら改行するように したつもりなのですが、1 つずつ "." が出力されず、 50 個いっぺんに "." が表示されてしまいます。 多分初歩的なことだと思うのですが、助言いただけませんでしょうか。 ソースはこんな感じです。 ------------------------------------ #!/usr/bin/perl $counter = 0; while (<>) { $counter++; if ($counter % 5000 == 0) { if ($counter % 250000 == 0) { print "\n"; } else { print "."; } } } ------------------------------------
教えてほしいです。 if($x = $y) みたいな、代入式で真偽を判断するケースって C言語みたいに最終的な$xの値(まぁどっちでもいいか)が 真偽の値になるという考え方でいいのでしょうか。 どうも素直にそう考えていいものか。 配列へリストの代入とかだとどうなるんでしょうか・・・。 if(@m = sort @n)とかは、スカラーコンテキストとして 配列の要素数で真偽を決めるってことでいいのですか?
>>280 俺はその手の出力は STDERR に出すようにしてるよ。
STDERR ならデフォルトでバッファリングしないので。
>>283 エラーじゃない物を標準エラー出力に吐いてるって事?
それはどうかと思うが…
285 :
280 :2005/11/17(木) 21:37:33
>>282 , 283
即答ありがとうございます。
助かりました!
>>284 別に、エラーじゃなきゃ STDERR に出しちゃダメなんて決まりはないし。
ていうか、本来の出力ではない、ヘルプメッセージやプログレスバーなどを、
STDERR に出すプログラムなんてほかにも世の中にはたくさんあるよ。
>>286 それもそうか
よく考えたら、この場合エラー出力に吐いて置いた方が返って都合が良いな
こういうのは stderr の方がいいね。 stdout への出力は、リダイレクトして使用したりもするし、 こういうのを混ぜると汎用性が下がるしね。
289 :
281 :2005/11/17(木) 22:05:33
>>282 レスありがとうございます。やってみます〜
290 :
デフォルトの名無しさん :2005/11/17(木) 22:32:09
>>283 >
>>280 > 俺はその手の出力は STDERR に出すようにしてるよ。
> STDERR ならデフォルトでバッファリングしないので。
ファイル転送などの100%のうちの進行具合を計るプログレスメーターは
STDERRに出せば良いが、この手のプログレスメーターは、トータル数を
見るために使うこともあるし、途中に重要な情報を混ぜこむこともある。
"...."ごとファイルに書き込むこともある。
>280 どうでも良いが自分だったら print SRDERR "." unless $. % 500; print SRDERR "\n" unless $. % 250000; と書く。
〜 unless $. % ほげ はぱっと見わかりにくいので 〜 if $. % ほげ == 0 の方が好みだな。
俺もunless使わない派なんだけどこれってマズいことあるのかな?
標準「エラー」出力なんだから、エラーを吐くだけの方が妥当だろう。 -t で端末かどうか調べてプログレスメータを表示するべきかどうか 判断させるのが良いかと。 ……なんて固い事考えないで、目的を達成できるように書けばいいか。 その方が Perl 使いらしい。
297 :
276 :2005/11/18(金) 09:10:43
sortして、100個目の内容を取り出したい時に、 一旦何かの配列に入れないでやるにはどうすればいいですか?
おお、でけたでけた 何、+て 演算子? 関数?
>>300 マニュアルを読めば分かることを聞かない。
修辞疑問にまで答えようとしなくていいから
303 :
277 :2005/11/18(金) 12:58:29
>>301 言えない…回答時にリファレンスへのリンクを貼ろうと探したけれど見つけられなかったなんて言えない…
perlopの中にあったのね。perlsynとかを探してた( ´д`;)
Perlモジュールがインストールされてるかされてないかで処理を分けたいんですが if(もじゅーるあった){} else{} ↑こんな感じで なんかいい方法ないでしょうか?
306 :
304 :2005/11/18(金) 17:04:37
>>305 回答ありがとうございます。
具体的にはどのようにすれば良いのでしょうか?
自分で色々やってみたのですが、
Can't locate云々とエラーメッセージが出て強制終了されてしまいます
>>306 BEGIN {
eval "use Hoge"; # try
if ($@) { # catch
# モジュールが無かった
} else {
# モジュールがあった
}
}
308 :
304 :2005/11/18(金) 17:15:17
風が止んだ…
310 :
デフォルトの名無しさん :2005/11/19(土) 10:17:04
演算子%について質問です。 %は小数点をどのように処理しているのでしょうか? 5 % 2.99 が 1 で 5.99 % 2.55 が 1 で 5.99 % 2 が 1 これって、全て 5 % 2 ということでいいのでしょうか? よろしくお願いします。
PurePerlなgzip扱えるモジュールないかな
314 :
310 :2005/11/19(土) 12:22:15
>>311 該当項を読みましたが、仮定が$a,$bの「整数」となっていて、未だ疑問が
解決いたしません。
詳しい説明をよろしくお願いします。
315 :
310 :2005/11/19(土) 13:08:33
ここで検証するスクリプトを書ける奴だけが勝ちあがってるんだよな。
317 :
311 :2005/11/19(土) 14:19:36
>>314-315 Perl は弱い型の言語なんだから、整数値が期待されるところに
置かれた値は整数値として評価されるし、文字列が期待される
ところに置かれた値は文字列として評価される。
my $chr = ('a'..'z')[ rand 26 ]; # int 不要
"+1.0e2cm" == 100 ? 'eq' : 'ne'; # eq
だからマニュアルに「整数」と書かれているなら、それは仮定では
なくて両オペランドを整数値として評価した上で、という意味になる。
>>316 勝ちあがるって…。使えない奴が淘汰されるのは自然の摂理なんじゃないの。
どっかのコーディング規約で$_は汚染されている可能性があるから foreach my $var (@array) { のように明示して使うというのを見た気がするのですが みなさんの場合、使い勝手と厳格さを天秤にかけてどっちを選びますか? 自分は$_でも問題ないと思うのですが再帰的なプログラムではまったような記憶もあります。 それとPerlにはpearのコーディング規約みたいなものは無いのでしょうか。
$_ は遅いって聞いたが
322 :
デフォルトの名無しさん :2005/11/19(土) 16:51:03
>>318 それは当然として、使えないのに生き残ってる奴は
この程度なら自分で検証くらいできるんじゃないかなと。
俺ならnroffに(半手動で)変換するscript書いてrfc2223通りに出力するが。
Perlウィザードはforeachもforと書くのれすか?
ハードゲイフォー
328 :
323 :2005/11/19(土) 19:23:48
>>325 なるほど。例のファイルはRFC2223の規格に定められているものであり、
nroffを使って出力するものなのですね。このようなファイルを時々見かけ
ていたのですが知りませんでした。ありがとうございました。
>>326 Perl では foreach と for はシノニム。
foreach (my $i = 0; $i < 5; ++$i) { print "$i\n" } # "for" ループ
for (0..4) { print "$_\n" } # "foreach" ループ
但し "foreach" 修飾子は存在するが "for" 修飾子は存在しない。
print "$_\n" for 0..4; # "foreach" 修飾子。OK。
print "$i\n" foreach ($i = 0; $i < 5; ++$i); # "for" 修飾子は存在しない。エラー。
Perl で for ループが必要な場面というのは少ないのと、
for なのか foreach なのかは見た目ですぐ分かるのとで、
略して書いても大して問題にならない。律儀に foreach
と書くかどうかは好みの問題。
for, foreach どちらも同じと言われても for は、for (my $i=0; $i<10; $i++) {} の使い方しかしないし、 foreach は、foreach (@array) {} の使い方しかしないなぁ。
漏れはforもforeachと書くよ。foreach一神教派だし。 foreach (my $i = 0; $i < 10; $i++) { print "$i\n"; }
>>317 関係無い者だけど勉強になりました。dクス
じゃあ,俺はfor一神教派だ. 対立しようぜ.
334 :
326 :2005/11/19(土) 20:44:21
レスありがとうございます。 それなら自分はforでいこうと思います。 そもそもPerl使いはタイピングをいやがるという話だし 言語もそのような思想でつくられてるそうなので。
forかforeachかって話よくみかけるけど bshかcshか?みたいな話でけっこう笑える そもそもfor,foreachってどこから借りてきたんだろね fortranはDOが基本だしCとcshあたりなのかな?
>335 「けっこう笑える」と言っているが、どこで笑えるのかよくわからないので、笑いどころを教えてくれ。 だいたい、bshとcshは違うものだが、for と foreach は同じだ。
>>334 タイピングを嫌がる*のも*有り、かな。Perl は自然言語的な
表現の幅を持てるようデザインされているので、厳格な文体
で記してもいいし、くだけた言い回しも受け付けてくれる。
>>335 赤リャマを読んだ限りでは、多分それで正解。>借用元
教えてください。 あるテキストファイルにときおり存在する1行以上の連続する空行を <p> の1行に圧縮するプログラムを書いているのですが、 open MYFILE, "???.txt"; undef $/; $text = <MYFILE>; $text =~ s/^\s*$/<p>/mg; print $text; これを実行すると、1行のみの空行は<p>に圧縮されますが 2行以上の連続する空行は<p><p>と圧縮されます。 正規表現の行を $text =~ s/^\s*$/<p>/m for 1..10; とかにすると意図した通りになります。 (もちろんこれだと10個までですが) なぜこのような結果になるのでしょうか?
>>336 Bシェルの for..in 構文も、Cシェルのforeachも
だいたい似たり寄ったりじゃない。
そんなところがさ、君もそう思わないかい?
シェルの話じゃないけど。
>>338 pタグは閉じタグが必要なので、HTMLとして使い方が間違ってます。
>>341 for, foreachは基本的に一緒。
ただし、後置できるのは foreach タイプのみ (for と書いた場合も)。
for (; ;) のタイプは後置できないよってこと。
>>329 は、わざと互い違いに書いてるみたいだけどちょっと分かりにくいね。
>>338 $text = "0\n1\n\n2\n\n\n3\n\n\n\n*";
while($text =~ m/^\s*$/mg) {
print join(':',length($'),length($&)),"\n";
}
こういう事らしい。
空行が1個の場合は0文字幅の一致が1回。
複数の場合は、n文字幅の一致と0文字幅の一致で2回マッチ。
後置きfor(foreachでも)ってループ変数指定できないのが なんかかゆいところだよね。 1ラインであんまり複雑なことすんな、って事なのかもしれんが。 Perl6では変わるのだろうか?
>>343 その出力分かり辛いよ(笑)。
my $text = "0\n1\n\n2\n\n\n3\n\n\n\n*";
while ($text =~ /^\s*$/gm) {
tr/\n/./ for my($pre, $match, $post) = ($`, $&, $');
print "$pre($match)$post\n";
}
$ は*行末の直前*にマッチするというのが原因だね。
$text =~ s/(\s)*/<br>/mg;
>>340 の言うとおりpではなく、せめてbrだな。
347 :
338 :2005/11/19(土) 22:19:16
回答ありがとうございます。 ちなみに今はHTMLの文法はおいておいてください。 グローバル置換は順番に1つ1つ置換していくのとは 違うということでしょうかね。 $text =~ s/^\s*$/<p>/m for 1..10; これだと違ってくるのはなぜなんでしょうね。
>ちなみに今はHTMLの文法はおいておいてください。 これだからプログラマ(スクリプタ)の吐くHTMLは汚いっていわれるんだぞ・・・
349 :
341 :2005/11/19(土) 22:29:07
>>342 ありがとう
「for」を「3パート」って意味で使ったんだね
いまどきは、HTMLをスクリプトに埋め込んだりしないで テンプレートにしないか。デザイナに文句いわれないように。
351 :
338 :2005/11/19(土) 22:32:22
>>348 いやだから、目的は正規表現の学習であって
プログラムはそのために作ってるだけです。
もっといえばオライリーの「正規表現」から
サンプルコードをもってきているんです。
別に<p>だろうと<z>だろうと何でもいいのです。
>>351 こいつ何開きなおってんの?
そもそもタグいじるならWebprogだろ。
目的もなく置換したいなら正規表現道場いけよ。
353 :
338 :2005/11/19(土) 22:48:11
>>352 は?
正規表現の本読んでいて、そこにあるサンプルプログラムを
そのまま実行してみたり、少し変えたらどういう結果になるかとか
そういう学習をしてるのがそんなにおかしいですか?
実際にサンプルプログラムをそのまま持ってきてるんで自分が
作ったプログラムでもないし。
しかも本に書かれている結果とは違った結果になったわけで、
十分研究の意味があるということになるじゃないですか。
開き直るもなにも、開き直る必要もないですが?
>>352 (゚Д゚)ポカーン
<>を見るとHTMLだと思い込む香具師多いのか?
>>338 はHTMLとは一言も言ってないなと思いつつ読んでた訳だが
独自構文か何かかと
SGMLベースのHTML4.01までは、連続するp要素の終了タグは省略可だった希ガス。
>>355 だな。ついでに2.0だったか1.0だったかまではbr同様単独で段落の区切りに書く物だったと聞く
まあそれこそ板違いだから程々に
>>356 HTMLの文法は置いておいてくれって言ってんじゃねぇか
それでもまだHTMLの話をする馬鹿の神経がしれねぇ
なんにせよ質問者の態度が悪すぎるなw
お前の目はかざりか?w
最近ム板殺伐としすぎだよね
356は'独自構文'に対するレスだと思うのだが… どちらにしろ、この手の質問は、 後出しで違う文字に置換する質問を出してくる希ガス。
# ここからまったり
364 :
デフォルトの名無しさん :2005/11/19(土) 23:26:17
もっと殺伐を!!
どうでもいいけど 「は?」 と書かれると癇に障るよね
このスレでHTMLの文法は置いておいてくれという 質問者のコメントは至極まっとうじゃないのか? なんなんだこのスレ違いの回答は。。。やれやれ 回答者マズすぎ
それ以前にその相手の言いがかりのほうが癇に障ると思ふ。 こいつ呼ばわりとか。それも結局自分のはやとちりが原因。 「は?」は、よく我慢した方だろ。 俺ならアホかてめぇくらいは言いたくなるな。
普通、質問者ってのは、もっと腰を低くあるべきものだと思うがw
おまいらもちつけ sleep(60);
370 :
デフォルトの名無しさん :2005/11/19(土) 23:38:15
低かったと思うよ。
ただ
>>352 のようなバカには別に腰低くする必要ないじゃん。
質問者もそいつだけには答えて欲しくなかっただろうしww
煽りに一々反応してるようじゃまだまだ青いね
煽りってことにしたいらしいwww
質問を挙げる前に今一度精査してみるのもよろしいかと。 いろいろやってみたら解決しちゃった♪って云うことも少なからずかと。
へ?なんか人違いしてない?
ふんにゃかふんにゃか
378 :
343 :2005/11/20(日) 00:16:28
>>345 自分でもそう思う。分り易い奴、乙。
>>347 $text =~ s/^\s*$/print(join ':',pos $text,length $`,length $&,length $',length $text,"\n"),'___<P>___'/mge;
print length $text,"\n";
お前らPerl初心者でも分かるようなコード書けよ
Perl6ってどうなってるんですか?
>>345 しまった。まじで分からん。俺にも教えてくれ。
>>347 が言ってるのは
while ($text =~ s/^¥s*$/<br>/m) {}
と
while ($text =~ s/^¥s*$/<br>/mg) {}
で結果が異なる事なんだよね。
gオプションの時は
/^¥s*$/ の他に、置換後の /^$/ にも反応してるってこと?
Perl の蟲じゃないかな。 どう考えても、gオプションの動作がおかしい。 $text1 = $text2 = "abc\n\n\n\n\n\ndef"; $text1 =~ s/^\s*$/K/gm; while( $text2 =~ s/^\s*$/K/m ){} print "\$text1:$text1\n\$text2:$text2\n"; $text1:abc KK def $text2:abc K def
cronでperlスクリプトを定期的に起動して、あるサーバが正常に機能しているかチェックしたいのですが、 HTTPサーバに接続して、ページを取得した際に、正常に取得されたかどうかはどのようにしたら分かるのでしょうか?
foreach (@hoge){ foreach my $x (@huga){ 〜 と、 foreach my $x (@hoge){ foreach (@huga){ 〜 はどっちがいい?
>>385 好みの質問?
漏れはどちらかと言われれば後者だが、両方名前をつける事が多い
>>385 入れこにするなら$_使わず、両方とも変数使うかな。
ぱっと見て訳わかんなくなるし。
>>385 基本的に両方名前を付ける。
ループで $_ を使うとしたら、最も入れ子になったループが
一文で終わる時だけだな。
foreach my $x (@hoge) {
$_->do_operation() foreach @fuga;
}
>>382 gオプションの場合は、1つマッチしては置換というような
ことをしてないような希ガス
マッチが余分にある気がするねぇ…
バグ報告?
俺もforeachは必ず変数名つける。入れこじゃなくても。
使わないとすれば、
>>388 と似たような感じのとき。
例えば、
foreach(@file){ -T or return }
とかみたいに書きたいときだけ。
漏れは $_ って文字はタイプしないような構成にする。
>>382 のバグ報告しておきました。
(下の文章を
[email protected] に送りました。)
title: Perl Bug in s///mg
Dear Sirs,
I expected in the following script that $text1 and $text2 should
have a coincide result. However, $text1 has an excess 'K' which
is considered to be a bug.
My environment is Windows XP, ActivePerl 5.8.7.815.
---------------script-------------------------
$text1 = $text2 = "abc\n\n\n\n\n\ndef";
$text1 =~ s/^\s*$/K/gm;
while( $text2 =~ s/^\s*$/K/m ){}
print "\$text1:$text1\n\$text2:$text2\n";
---------------output-------------------------
$text1:abc
KK
def
$text2:abc
K
def
これがバグと認められたとして、直したバージョンてすぐに 出るものなの?パッチだけとか?
>>391 え? それ、正しい動作...
まず、s///gでは置換途中は対象変数が元の値を保持している。
確認例 perl -e "$_='AAA ';s/A/print/ge;print"
/gは、元の文字列でマッチが成立する場所を全て置換するという事。
m//g と s///g でマッチ個所は同一になる。
$の件(
>>345 )を別の表現にすると、先読みの肯定(/(?=\n)/)
単純な例
$_='a aa aaa aaaa aaaaa';
s/a*(?=a)/print "$`($&)$'\n"/ge;
print;
これは、直後が'a'である0文字以上の'a'を置換という指定。
print出力は345準拠。
ここははやとちりなインターネッツですね。
use re 'debug' ぐらいしようよ…。
>>394 それって意図したとおりの動作なのかな。
単純に何度も置換するのと、グローバルで一括置換するのと
結果が違うのは、まずい気がするんだが。
>>397 そうすると、394氏が言ってる
m//g と s///g のマッチ箇所が異なる結果になるので
それはそれでよくないと思うのだけどな…
>>398 というよりかは、m//gの動き自体からおかしいのでは?ということに。
>>390 俺もforeachのときは付けるけどmapだと使わないときあるな。
402 :
399 :2005/11/20(日) 17:34:25
頭からまとめときますか。
>>338 > なぜこのような結果になるのでしょうか?
>>338 の前者は $text に対し s///g を一回だけ実行し、その処理過程で
複数の置換を行っている。後者は $text に対し s/// 自体を複数回実行し、
それぞれ一回ずつの置換を行っている。前者では二つ目以降のマッチ開始
位置が前回マッチの終了位置となるのに対し、後者では毎回文字列の先頭
にリセットされる為、結果も変わってくる。
>>356 ム板にもある。
正規表現 part2
http://pc8.2ch.net/test/read.cgi/tech/1131028296/ >>381 >>389 上の説明と
>>399 参照。
>>393 >>394 で書かれているように、/g の処理中で逐次的に置換されるわけ
ではない。よって 2\n@\n3 ではなく2\n\n\n3 のまま。
>>399 も参照。
>>397 違う事をしているのだから結果も違って当然。
(my $str = 'ababab') =~ s/ab/abc/g; # abcabcabc
# my $str = 'ababab';
# 1 while $str =~ s/ab/abc/; # 無限ループ!
違うことをしているから結果が違うのはいいとして、 実装した人がそういう違いをだしたかったかは わからんのでは。
つまり動作自体は正しいので、バグではなく、どうしようもないって事だね 置換してるんだから検索開始位置がズレて当然
改行にマッチしたいときは不用意に$を使うとどつぼに嵌るということですな $text =~ s/^\s*\n/<p>\n/mg; とするのが正解?
406 :
399 :2005/11/20(日) 18:08:44
>>402 s{(?<=後者では毎回文字列の先頭にリセットされる為、)}
{また、置換対象となる文字列自体が変化している為、}
の方が正確か。
>>403 「実装した人」とは? この perl(1) の振る舞いが「正しくない」と
思うなら porters@ にでも提案してみてね。
>>405 正解と言うか、一番素直な表現だと思う。
$ は改行にマッチするパターンでなくて改行直前にマッチする
0 文字幅のパターンだという事を押さえておけば OK。
407 :
405 :2005/11/20(日) 18:30:40
>>406 確かに正解という限定的な言い方はTMTOWTDIの考え方に反してましたね。
訂正 s/正解/安全で分かりやすい表現/
改行直前にマッチということを今まで知らなかった漏れは
ちょっと正規表現勉強しなおしてこよう・・・
正規表現であるかどうか分からない部分を$1、$2…で使いたいときに perl -w でUse of uninitialized value… と怒られないようにするにはどうしたらいいのでしょうか…
>>408 ちょっとそれじゃ説明不足。もう少し具体的に
>>408 'def' =~ /(?:<(.*?)>)?(.*)/;
こんな感じのときかな。definedを調べれ
411 :
408 :2005/11/20(日) 21:18:30
>>409 すいません…
例えば
$test = "AB";
if ($test =~ /^([AB])?([AB])?([AB])?$/) {
if ($1 eq "A") { print "\$1 match:A \n"; }
if ($2 eq "A") { print "\$2 match:A \n"; }
if ($3 eq "A") { print "\$3 match:A \n"; }
}
みたいなのだと最後のifの文で警告が出てしまいますよね。
このような場合の対処法をよろしければ…
>>410 defined調べてみます。
ありがとうございます。
定義済みかどうかを調べる制御構造を
増やさなければならないということなんでしょうか…。
いちいち undefined 調べるのが面倒とか言い出すんなら なんで -w で実行する必要があるのかっつーとこも問題になってくると思ゐ
defined($n) &&
>>411 > 定義済みかどうかを調べる制御構造を
> 増やさなければならないということなんでしょうか…。
確かに一つ判断は増えるが、チェックを増やすとネストが深くなるような長めの処理なら、
一旦レキシカル変数に落とすだろうから、そのときにチェックすれば良いのでは
my $hoge = defined $1 ? $1 : '';
また、もしマッチしていなければその処理を行わないというような内容なら、
そもそもそのチェック自体が要件なわけだし
>>408 my @captured = ($1, $2, $3, $4); # まず配列(でもなんでも)に値を移して
foreach (@captured) { # ループにかけ、
next unless defined; # 未定義ならはじいてしまうか、
# あるいは、
$_ |= ''; # 適当に初期化しておいてから、
# 思う存分本来の処理をやりましょう。
}
my @Check_array = ($test =~ /^([AB])?([AB])?([AB])?$/) print "\$1 match:A \n" $Check_array[0] eq 'A'; : : みたいな?
なんか、こんがらがってきたけど、$(行末)ってのは改行文字を含む場合と 含まない場合とがあるんだよね?\n$とやった場合は$に改行は含まれないが $だけなら改行文字も含むってことでいいの?
>>417 いいや。改行文字は「常に」含まれない。
>>408 >>415 > my @captured = ($1, $2, $3, $4); # まず配列(でもなんでも)に値を移して
試していないけど、この文を実行する時に$2, $3, $4などが無ければ、
また怒られるのでは?
リストコンテキストでは、($1, $2, $3, $4, ....)が返ってくるよ。
my @captured = $test =~ /^([AB])?([AB])?([AB])?$/;
>>418 リャマによれば、ドル記号アンカーは文字列の末尾、または文字列の末尾に
ある改行文字にマッチします...とあるが。
/^fred$/は"fred"にも"fred\n"にもマッチするんで。
ダブルクォート文字列内で使えるエスケープに 「\e」がありますよね。 これの使いどころがわからないのですが、 どういう使い方するのでしょうか? ラクダ本には乗ってないようで、新しめの機能?
422 :
415 :2005/11/21(月) 00:28:34
>>419 連結したり展開するなどの形で値を「利用」しなければ警告は出ないみたいよ。
> my @captured = $test =~ /^([AB])?([AB])?([AB])?$/;
場合によりけりだけど通常はこちらのほうがいいよね。
予約されている範囲なら警告はないんで、順序を入れ換えたりする場合には ($1,...) も便利だけど。
>>420 $_ = "fred\n";
print 'case $ >', /($)/, "<\n";
print 'case \\n >', /(\n)/, "<\n";
424 :
デフォルトの名無しさん :2005/11/21(月) 00:40:20
超初心者ですみません。 配列関数について分からないのですが、 @list = (1, 2, 3); の意味は@listが1、2、3という3つの値を持子とは分かるのですが @primes = (0, 0, 2 .. $limit); とはどういう意味なんでしょうか? (limitにはある整数値が入っています)
>>420 おちついて、$&や$'を確認しろ。
らくだ本(赤い奴だろうと青い奴だろうと)に説明あり。
>>421 第二版には載っていたけど、第三版には載ってないの?
赤い奴には載ってないな。
Perl4でも\eはESC文字だった気がするけど、うろ覚え。
>>423 ということは行末$とは改行文字の直前てことでいいのかな?
428 :
デフォルトの名無しさん :2005/11/21(月) 00:55:12
>>425 恥ずかしい間違いすみませんでした。
また答えを教えていただいてありがとうござていました。
予想していたとおり、0からlimitの値までの昇順の配列なようですが
(limitが5だったら1,2,3,4,5)
なぜ、0が2つあるのかが謎なのです。
素数を求めるプログラム(エラトステネスのふるい)
に使うので「2以上limit以下の配列」なら良いはずなのですが・・・。
>>427 行末が改行文字で終わっていればその直前。
行末が改行文字で終わっていなければ文字列の末尾。
>>428 変数の中身をどう使うかなんてのはそのプログラムを書いた人に聞いてね。
430 :
デフォルトの名無しさん :2005/11/21(月) 00:59:40
>>429 はい、すみませんでした。
0を無視して、@primes = (2 .. $limit);だと思って解釈します。
皆様、ありがとうございました。
>>421 > ラクダ本には乗ってないようで、
5.3.2
432 :
408 :2005/11/21(月) 01:41:28
みなさまどうもありがとうございます。
なんらかの形でdefinedのチェックを通せばよいのですね。
>>413 >defined($n) &&
そうか…論理和は左から真でなければ右を見ないのでこれでいいんですね。
これはお手軽ですね。
他にもスマートな例をいただきありがとうございました。
僕の性器を表現したいんですがどう書けばよいでしょうか
ω
>>411 そのケースだけで言えば、/^([AB]?)([AB]?)([AB]?)$/ にして、マッチしなければ
空文字にすればいいんでないの。
warnings使ってるけど基本的にバグ発見ためで 意図してるなら未定義の変数も平気で使う人って実は少ないの?
意図しなくてもタイピングミスとかのチェックに
>>436 意図して未定義の変数を使うってのが、そもそも有り得ない。
>>435 遅れて見てたが、はなから /^([AB]?)([AB]?)([AB]?)$/ で充分だと思う。
複雑なパターンでもグループ化と後方参照の為の()を区別すればいいだけで。
/ ...((?:[AB][XY])?)$/
440 :
391 :2005/11/21(月) 11:57:12
>>391 の質問に対して、perl.orgよりさっそく丁寧な回答を頂きましたので、ここに転載します。
回答内容は、
>>399 の指摘と同様の内容になっています。
Thanks for the report, however this is correct behaviour.
The main thing to be aware of is that for s///g, we retain the source
string for the pattern matching so as not to be confused by any changes
that occur as a result of successful substitutions, building those up
instead into a separate results string.
In the first case then, the first match occurs at offset 4 in the string,
just after the first newline. The /\s*/ matches the next 4 newlines,
and the /$/m matches just before the 6th (final) one.
In the result string, those 4 newlines are replaced with 'K'. In the
source string, the position to continue matching is now still just
before the final newline, and at this point we repeat and match again -
the /^/m matches the position just after the 5th newline, /\s*/
matches zero characters, and /$/m matches (as before) just before the
6th (final) newline. This zero-width substring is thus replaced with
another 'K' in the result string.
Now the match is repeated again, still from the same position, and
the pattern matches a third time, matching in exactly the same way
as the second time. However this time the string has a flag attached
to say that we've already matched a zero-width substring at this
position, so the match is rejected, and no further matches are found.
You can see this happening with some runtime diagnostics: perl -wle '$_="abc\n\n\n\n\n\ndef";s/^(?{print "pos ", pos($_)})\s*$(?{print "match"})/K/gm' which prints: pos 0 pos 4 match pos 8 match pos 8 match pos 9 In the second case, we do a single replacement as in the case of the first match described above. When we invoke the substitution a second time, however, we are acting on the modified string, and so no further matches are found. It is the fact that the second substitution acts on the modified string that causes the visible difference between the two cases. This is all quite difficult to explain clearly, I hope my attempts have helped, Hugo van der Sanden
実行しているのがwebか端末かを判別したいのですが どのような方法が論理的かつ美しいのでしょうか。 現在はとりあえず$ENV{HTTP_HOST}があったらwebから実行されているとしています。
>>443 ありがとうございます。実は
>>296 の投稿を見てカンピュータで
-t <STDOUT>
としたのですがコンソールから実行してるのにundefが
返ってきてしまったので投稿してしまいました。
もっと精進します。
446 :
134 :2005/11/21(月) 20:58:19
open(FH, ">>ログファイルへのパス"); でファイルをオープンした後に、 unshift @log, "あああああ<>いいいいい<>ううううう\n"; で@logに代入して、 print FH @log; という形でファイルに書き込んだのですが、何故かログファイルが1行に連なってしまいます。 しかも、\nが・という感じに変わってしまうのですが・・・どうしたら良いですか?
うちの環境ではならなかったけど
\r\n
バイナリファイルで開いて深呼吸して空の星を見るかのごとく数値を見つめるのだ。
450 :
134 :2005/11/21(月) 21:17:39
>>448 出来ました!ありがとうございます。
しかし、なぜ\nではなく\r\nとしなければならないのですか?
452 :
408 :2005/11/21(月) 21:39:41
>>435 >>439 ありがとうございます。
?を括弧の中に入れれば良かったのですね。
よろしければもう一つ、
例えば
$test = "AB";
if ($test =~ /^([AB]?)([AB]?)(?:C([AB]?))?$/) {
のような形(つまり3回目はCが先行する場合のみマッチしたい)では
処理が$3まで到達しないのかやはり未定義になってしまうようです…
このような形に応用するやり方はあるでしょうか。
考えたのですが、どうしても…
453 :
134 :2005/11/21(月) 21:41:47
う〜・・・つまり、プラットフォームによって改行コード値が違うのですね。
しかし、それが何故\n→・の文字化けに繋がるのでしょうか。
あと、
>>451 さんの資料を読む限り、改行文字は\nなのですが、\r\nで記述しなければいけないのはどうしてでしょう・・・
駄目だ、定期テスト期間中なのに頭はperlでいっぱいですonz
>>453 ヒント
OSの改行コード
Perl(発祥?のOS)の改行コード
メモ帳(エディター)が対応している改行コード
455 :
134 :2005/11/21(月) 21:57:28
>>454 な、なるほど!
テキストエディタで開かずドリームウィーバーで開いてみたら、ちゃんと改行されていました。
つまり、Perl(発祥?のOS)の改行コードに対応していないテキストエディタでログファイルを見ていた私がperlの奥の深さを知らなさ過ぎた訳ですね^−^;
どうもありがとうございました!
しかし何故か、unshiftでログファイルに書き込んでいるのに、配列の末尾に要素が追加されてしまいます・・・。
Perl発祥のOSかぁ。壮大な話だ CR, LF, CRLF ファイルに追加書き込みしてるから
>>452 #!/usr/local/bin/perl -w
use strict;
for (qw(A BA ABCA)) {
if (/^([AB])?([AB])?(?:C([AB])?)?$/) {
if (defined $1 && $1 eq 'A') { print "\$1 match:A \n" }
if (defined $2 && $2 eq 'A') { print "\$2 match:A \n" }
if (defined $3 && $3 eq 'A') { print "\$3 match:A \n" }
}
print "--\n";
}
__END__
458 :
134 :2005/11/21(月) 22:32:22
>>456 ファイルに追加書き込みとは">>ログファイルへのパス"のことですよね?
普通に書き込みが出来る入出力記号(>や+<)を記述すると、追加されずに上書きされてしまうです・・・。
459 :
134 :2005/11/21(月) 22:54:49
出来ました・・・お騒がせして申し訳ないです。 ただ、@logに要素を入れる場所を間違えていたみたいです。 そろそろ真剣にテスト勉強しないと留年するのでしばらくperlは我慢します...λ
ActivePerl 5.8.7.815 これをダウンロードしたんですけどあってますか?
恐ろしい質問だ
>>460 合ってるかどうかはMD5を見よう
あるいは、それを本当に自分がダウンロードしたのか思い出してみよう
こういうのはWebProg板でやれよ
print <<PAGE_END; aaaaa bbbbb ccccc PAGE_END こんなprintの使い方ありますよね? でもラクダ本にはこの手の使い方のってないし、 どのprintの構文に照らし合わせても、なぜこれが できるのかわからんのですが、どういうことなんでしょうか?
>>466 それはヒアドキュメントといってprintに限ったものではない
my $hoge = <<EOM;
hogehoge
EOM
ラクダ本は持ってないんだが、リファレンスの何所に載ってるんだろ・・・
469 :
466 :2005/11/23(水) 15:15:07
レスどうもです。 そういうものがあったのですね・・・。 こんな使い方 print <<`EOC`; # コマンドを実行する echo hi there echo lo there EOC まであるのかと思い、やってみたら、Windows環境ですが、最初の コマンドしか実行されませんでしたTT
>>466 赤ラクダには載ってるよ。青にも載ってるんじゃないかな
青ラクダ本にも、CGIとかで print ・・・; print ・・・; print ・・・; ってやるよりヒアドキュメント使えってあったよ。
472 :
466 :2005/11/23(水) 16:41:04
おおせのとおりです。 printではなくヒアドキュメントでラクダ本を調べると 詳しい解説が載っていました。 さすがラクダ本・・・。
ヒアドキュメントの使い方上級編 print $header, <<"BODY_END", $footer if defined $hoge 適当に 複数行の 本文を書いて BODY_END my @text= ( <<"ARRAY1",<<"ARRAY2",<<"ARRAY3" ); 複数行に 渡る 文字列の 代入を ARRAY1 ¥nとか 使って 書くと 美しくない ARRAY2 とか 思う人に おすすめ。 ARRAY3 my @text= ( <<"AND",<<"AND",<<"END" ); これって何かの本に載ってる? 適当に自分でいじってて、 AND できたらいいのに、 AND がホントにできた例なんだが。 END
(;^ω^)
普通にperldocに載ってますが
477 :
473 :2005/11/23(水) 23:27:30
478 :
デフォルトの名無しさん :2005/11/23(水) 23:39:44
全くのPerl初心者が質問して良いですか? 例えば配列@list = ( 28, 10, 7, 15, 34, 9, 58, 2 ) を ヒープソートするロジックを教えて頂きたいんですが・・・。 考えても考えても、どう表現したらいいかわからん。
Perlから環境変数にアクセスするには%ENV使いますよね? よく本では、 $ENV{PATH} のようにやっているのですが、PATHってkeyの文字列ですよね? なぜにクォーテーションで囲まないのでしょうか? というかやってみると出来てしまうのですが。 なんででしょうか?
482 :
479 :2005/11/24(木) 00:38:18
レスありがとうございます。 裸のワードというのを初めて知りました。 しかし、今回のケースでは、そういう解釈ではなく 文法で許されているようですね。
ただし、たとえば"-"などは演算子とみなされてしまうので $ENV{foo-bar}は書けない $ENV{'foo-bar'}と書かないといけない
ところが先頭ではOKだったり。 $hash{-foo} = 'bar'; とかね。
485 :
デフォルトの名無しさん :2005/11/24(木) 14:49:22
リンクタグからURLを取り出したいんですが、うまくいきません。
$hoge=~m/(<.*?href.*?=("|')?)(https?:\/\/)?(.*?)($2| |\>)/
想定では
$1<href= $2" $3
http:// $4url部分 $5">
と、なるはずなんですが、
$4,$5が空になってしまいます。だれか助けてください。
486 :
485 :2005/11/24(木) 15:44:06
$2がnullのとき、どうすればいいんだろう?? eオプションで条件式つけてだらだらやるしかないんでしょうか?
>>486 同じ正規表現の中で使うときは$2じゃなくて\2
488 :
デフォルトの名無しさん :2005/11/24(木) 17:51:01
eclipseでperlは使えるんでしょうか?
>>488 何を持って使えるというのかにもよるが
つ EPIC
>>489 ありがd
検索してepicのページ見つけました。
なんだかよくわからないけど使ってみます。
491 :
デフォルトの名無しさん :2005/11/26(土) 12:07:39
IEでプロキシーを設定できますが、perlとのスクリプトからネットワークに接続した場合にもプロキシーは通ってるんでしょうか?
通ってません
493 :
デフォルトの名無しさん :2005/11/26(土) 13:25:45
Perlでプロキシー通す処理書けますか それともWindows側で設定するんでしょうか
例えばですが LWP::UserAgentのproxyメソッドで設定できます
自分の書いたサブルーチンを呼ぶときに、&をつけるかどうかについて ですが、&を必ずつけるというやり方はいいやり方なのでしょうか?
それって、例えば1ファイルのperl script書いた時、自作func()は呼び出される 「前に」必ず記述しないと駄目ってことになるの?
>>497 プロトタイプを使うなら先行宣言
使わないなら無くても何も文句は言われん
499 :
495 :2005/11/26(土) 15:07:06
そうですか、どうも。 では関数ということを強調するのに引数が無い場合でも my_func( ); こんな感じにするのはいいですよねぇ?
むしろ俺はそう書いてるが
普通そうする
502 :
デフォルトの名無しさん :2005/11/26(土) 15:45:01
プロトタイプ必要か? OOP派なのでそもそもプロトタイプは定義しない。 Perlで仕様ガチガチなsubを書くのもどうかしてると思われ どっちにしても可読性の観点でmy_func();か$o->my_method();にするけどね。
小規模なら何でもいいんだけどな
sub my_func(\@); こういうプロトタイプ書いておいて my_func(@hoge); とかなら使うけどな。
>>504 自分で作ったものを自分で使っている限りはどうでもいいんじゃないの?
他人に使わせるモジュールを書くのなら、値渡しか参照渡しか、
ユーザが気にしなくても使えるほうがベターでしょう。
(Perl のプロトタイプってそのためにあるのだと思っていたが)
初心者な質問でごめんなさい。 ブロック外に書いたmyがファイル全体のスコープを持っちゃうのって どう対処してます? ブラック外に書くのはサブルーチンの呼び出しだけだったりするんでしょうか。
対処って・・・?
>>507 504だけど、標準モジュールのソース読んだことある?
わざわざプロトタイプを指定しているのはperl4の時代から存在したものぐらいで
perl5以降の関数型標準モジュールを当たってもプロトタイプ指定は稀なように思える。
分野差があるかもしれんが。
今時プロトタイプなんて使わないべ
>>510 Perl4にプロトタイプは存在しない件(´・ω・`) 5.002から導入だそうだ
漏れ、小規模なコードはプロトタイプをがちがちに指定した物を書くのが
好きなんだけど時代遅れなのかな…
プロトタイプしとけば、引数の型チェックしてくれるじゃん
それをチェックしてくれるかどうかも、バージョン依存だったと思うから 俺は使ってない。 あと引数の型を sub foo(¥@) {...} として foo(@arr) で呼び出した時に 配列リファレンスを取り出してくれるかどうかも、バージョン依存だったはず。 なので俺はプロトタイプは使ってないし信用しないことにしてる。
オブジェクト指向でプログラムを作る場合 CPANで集めてきたモジュールの関数を利用するために 複数継承させたら、多重継承になっちゃうんだよね? 多重継承(・A ・)イクナイ!って聞いたので、どうしたらいいのでしょうか? 例えば package damepo; use LWP::Simple; use Encode; こんな感じです。
それは継承じゃない。 ちなみにPerlは多重継承をサポートしてるから気にすんな。
>>517 thx
これは継承じゃないんですか!!!
(´Д⊂ モウダメポ
サブルーチンと継承の差がよくわからなくなってきた
オブジェクト指向がいっこうにわかんね_| ̄|○
>>515 p134で実際に\@や\%を使っているけどな。
>>521 しかし、意味が違う。らくだ本の改訂版では\@とは、
「引数が@で始まらなければならない」という意味だから、
引数が「@foo」ならいいが、「(1,2,3,4)」みたいなのは
ダメということでしかない。
ようするにそういうバージョン依存な糞仕様に振り回されずに 残りの時間を別の所で有効に使うためにプロトタイプするな ってことでFA?
>>523 「Perl6 を使えば全て解決」で FA。
俺プロトタイプで & をよく使ってる。 高階関数を定義するのに便利だから。
CPANにあるモジュールを勝手にPHP化して配布したらまずいですか?
配布して何がしたいの?
Perl6? あぁあの補助金尽きて開発者が路上生活者になりかけてるやつか
perl6は俺たちが生きてる間にはお目にかかれないってやつでしょ?
>>522 改訂版でも\@は、(リストではなく本物の)配列のリファレンスだよ。
宣言例のsub mypop (\@)やsub mysplice(\@$$@)が説明。
テキストは、@arrayは良いが\@arrayや$ref_arrayは駄目という事。
perl6は俺たちの想い出の中にずっと生き続ける
Tkを使っています。 (MainLoopが回った後?)fork出来ないと言う記述を 見かけたような気がするのですが,本当でしょうか。
>>527 正確に言うと二次配布です。
友人に配るPHPのスクリプトにPerlのモジュールをPHP化したものを配りたいのですが、可能ですか?
変数名とか変えてこっそり移植して、シラを切りとおせばよかろう
>>533 CPANいってドキュメントのライセンス嫁よ
質問はまだかね?
Perl6 ・・・ Autrijus たんはどうしてあんなものに貴重な才能と時間を費やしているのでしょうか?
必然です
>>537 あの人のことは、われわれには分からないさ・・・。
CPANのライブラリをRubyに移植したやつを読んで、まずPHPに移植。 3つの言語で使用法を統一する為に、 移植後のPHPのライブラリを、RubyとPerlに再移植ならしたことある。 配布はしてないが…。あの頃は暇だった。
いらんだろ
>>532 スレッドは駄目だったと思うがforkは知らん。
てかそれ位自分で試せよ。
すいません。教えてください。 テスト,:10,田中<TANAKA>NONAMAEHA一郎<ITIROU>TO言<I>IMASU,N000,123,__,050210,99999, が$_に入っているとして、これを テスト,:10,田中NONAMAEHA一郎TO言IMASU,N000,123,__,050210,99999, テスト,:10,田中NONAMAEHA一郎TOIIMASU,N000,123,__,050210,99999, テスト,:10,田中NONAMAEHAITIROUTO言IMASU,N000,123,__,050210,99999, テスト,:10,田中NONAMAEHAITIROUTOIIMASU,N000,123,__,050210,99999, テスト,:10,TANAKANONAMAEHA一郎TO言IMASU,N000,123,__,050210,99999, テスト,:10,TANAKANONAMAEHA一郎TOIIMASU,N000,123,__,050210,99999, テスト,:10,TANAKANONAMAEHAITIROUTO言IMASU,N000,123,__,050210,99999, テスト,:10,TANAKANONAMAEHAITIROUTOIIMASU,N000,123,__,050210,99999, というように<>の部分を展開してout.txtというファイルに出力するプログラムを作りたいです。 どうか、よろしくお願い致します。
匂う、宿題の香り・・・
use strict; $_ = 'テスト,:10,田中<TANAKA>NONAMAEHA一郎<ITIROU>TO言<I>IMASU,N000,123,__,050210,99999,'; print $_, "\n" foreach f($_); sub f { my($s) = @_; if ( $s =~ /([^[:ascii:]]+)<([^>]+)>/ ) { my $pre = $`; my $post = $'; my(@s) = ($1, $2); my @r; push @r, f($pre.$_.$post) foreach @s; return @r; } else { return $s; } }
547 :
544 :2005/11/28(月) 16:12:33
>545 ぐっ…ご名答です。 >546 回答ありがとうございます。 print $_, "\n" foreach f($_); #←ここはprint $_, "\n";foreach f($_);ですか? 上のようにして変えても次の6行目でエラーが出るのですが…
回答があっても理解できないレベルじゃ聞いても無駄なんじゃ...
こんな役に立ちそうもない宿題出すなんてどこのボケだよ
>>544 ではないが、
俺には
>>546 みたいのは一生書けないだろうな、と思い知ったよ・・・orz
この宿題漏れなら3行で終わらせる。 $_ = 'テスト,:10,田中<TANAKA>NONAMAEHA一郎<ITIROU>TO言<I>IMASU,N000,123,__,050210,99999,'; 1 while s/^([^<>\n]*?)([^[:ascii:]<>]+)<(.+?)>([^\n]*?)$/\1\2\4\n\1\3\4/m; print $_, "\n";
(^∀^)問題良く見ろw
556 :
544 :2005/11/28(月) 19:26:24
答えてアリガト!(´▽`)です。 >550 すいません。ちゃんと動いてますね。ただ、恐縮ですが 546さんのプログラムを実行してみたのですが テスト,:10,田中NONAMAEHA一郎<ITIROU>TO言IMASU,N000,123,__,050210,99999, テスト,:10,田中NONAMAEHA一郎<ITIROU>TOIIMASU,N000,123,__,050210,99999, テスト,:10,田TANAKANONAMAEHA一郎<ITIROU>TO言IMASU,N000,123,__,050210,99999, テスト,:10,田TANAKANONAMAEHA一郎<ITIROU>TOIIMASU,N000,123,__,050210,99999, というような結果で@rと$sの中身も展開したい形にはなってませんでした。 展開したい形というのは テスト,:10,田中NONAMAEHA一郎TO言IMASU,N000,123,__,050210,99999, テスト,:10,田中NONAMAEHA一郎TOIIMASU,N000,123,__,050210,99999, テスト,:10,田中NONAMAEHAITIROUTO言IMASU,N000,123,__,050210,99999, テスト,:10,田中NONAMAEHAITIROUTOIIMASU,N000,123,__,050210,99999, テスト,:10,TANAKANONAMAEHA一郎TO言IMASU,N000,123,__,050210,99999, テスト,:10,TANAKANONAMAEHA一郎TOIIMASU,N000,123,__,050210,99999, テスト,:10,TANAKANONAMAEHAITIROUTO言IMASU,N000,123,__,050210,99999, テスト,:10,TANAKANONAMAEHAITIROUTOIIMASU,N000,123,__,050210,99999, というような形です。(_ _(--;(_ _(--;
>>556 だから宿題は自分でやれって。
#!/usr/local/bin/perl -w
use encoding "shiftjis";$c=2;sub branch{my($s,$t,$n,$r)=@_;if($n==$#$t){push@$r
,$s.$_ for@{$t->[$n]}}else{branch($s.$_,$t,$n+1,$r)for@{$t->[$n]}}}while(<DATA>
){@f=split/,/;@t=map/^([^A-Z]+)<([A-Z]+)>\z/?[$1,$2]:[$_],split
/([^A-Z]+<[A-Z]+>)/,$f[$c];branch"",\@t,0,\@r;$f[$c]=$_,print join",",@f for@r}
__DATA__
テスト,:10,田中<TANAKA>NONAMAEHA一郎<ITIROU>TO言<I>IMASU,N000,123,__,050210,99999,
きっと
>>544 が
>>546 のコード提出したら
多分先生に説明求められるだろうな。
学校で再帰や foreachの単純文使う段階に
入ってると思えねーw
中卒の俺に教えて欲しいんだけどperlって学校で習えるもんなの?
560 :
544 :2005/11/28(月) 20:01:28
以後気をつけます。m( __ __ )m っていうかあんた意外にいい人だね〜○感謝 自分でももっと勉強の必要ありだと実感しました。
s/中卒/中学生/
562 :
デフォルトの名無しさん :2005/11/28(月) 21:09:55
>>549 > 回答があっても理解できないレベルじゃ聞いても無駄なんじゃ...
なんで? 写して出せば終わりじゃん。
さげろ中学生
問題の意味がわからないのは俺だけか。 あれは一体何をしたいんだ。何の意味があるんだ。
566 :
544 :2005/11/28(月) 22:54:36
テスト,:10,田中<TANAKA>NONAMAEHA一郎<ITIROU>TO言<I>IMASU,N000,123,__,050210,99999, 端的に言うとこれは辞書の一部です。プログラムの目的自体は読み仮名と漢字の展開です。 田中という漢字の読み仮名が<>にあってそれぞれ別で辞書に登録したいということです。
567 :
554 :2005/11/28(月) 23:11:35
>>566 よく解らんが、キミが
>>556 に書いたとおりの結果を得たいのなら、
>>554 の結果も全くその通りになっているのだが。これでまだ不足があるのかな?
問題に意味がなくても正解があればいいんでね?
>読み仮名と漢字の展開です。 なんつーか、それなら文字コードとかもっと学ばないといけないような・・ 一応出力するプログラムができても、それに意味はないというか・・
ここまで色々な例を示されて、動かないからちゃんと動くコードを 出せと逝ってくるようじゃ終わってるな 時間がありあまってる学生時代からこれじゃな…
>>567 残念ながら君のコードが意図通り動くかどうかは環境依存の上、
s/// の REPLACEMENT で $1 の代わりに \1 を使うお過ちを
している。
はいはい残りは宿題スレに逝ってね
574 :
デフォルトの名無しさん :2005/11/29(火) 01:02:31
net::pop3使ったら、たまに添付ファイル部分の最初1バイトが欠けるんだけど? これ経験した人いる?なんで?
>>574 そういう経験はないな。しかしNet::POP3って添付ファイルの解析は
やってくれないのでいきなりそういう結果は出ないと思うが。どうして
Net::POP3のせいでかけたと考えたのかね?
576 :
デフォルトの名無しさん :2005/11/29(火) 09:32:47
$str="あああコーヒーあああ"; という文字列のコーヒーという部分を太文字にするために $str="あああ<B>コーヒー</B>あああ";のようにコーヒーの部分だけ 置換するにはどうすればいいですか?
$str=~ s/(コーヒー)/<b>$1</b>/go;
>>576 $str =~ s!コーヒー!<B>コーヒー</B>!;
579 :
577 :2005/11/29(火) 09:54:43
どっちにしろなんのひねりもない置換ですむ話なので このくらいわからないでperl使ってるというのは信じられん のだが釣り?
>>574 chompじゃなくてchop使ってたり、、という事じゃないよね。まさか
>>580 他人が書いた掲示板を弄ってみたいとか、そんなんだろ
583 :
329 :2005/11/29(火) 10:19:18
584 :
デフォルトの名無しさん :2005/11/29(火) 10:30:31
$honbunという文字列のテキストボックスから入力した 文字列$text_dataが含まれている部分だけ太字にしたかったんですけど $honbun=~s/$text_data/<B>$text_data<\/B>/g; でやってうまくいくんですが 入力された文字列がコーヒーという文字列だとエラーが出ちゃうんです。 うまく処理できる方法を教えてください
>>584 スクリプトファイルの文字コードを euc に変えなされ。
587 :
デフォルトの名無しさん :2005/11/29(火) 14:07:11
制御構文で if (A=1) {ここでCという値には3足して、Dという値には4足したい} elsif (A=2) {Cに100足して、Dには40足したい} こういった構文を作るにはどうすればいいですか? 普通if文の後って1つしか処理は出来ないの?
はぁ
大ボスがきたぞ
難易度自体も大ボスなら、倒しても経験値まったく上がらなそうなあたりも大ボス
倒しますか?勇者様
学校でperl習う所なんてあったんですね・・・ c、c++やパスカルくらいだと思ってましたよ。
594 :
デフォルトの名無しさん :2005/11/29(火) 14:45:03
perlってif構文のあとから、その下のelsif文までの間に 2つの変数に足し算を2回処理するとか出来ないの!?
お前ら釣られすぎ
597 :
デフォルトの名無しさん :2005/11/29(火) 21:07:23
>>575 通常のメーラーとNet::POP3で落とした同メールでソースを比較したら、
Net::POP3の方は、base64でエンコードされた添付の部分の最初1バイトが欠けてるんです。
もちろんデコードしても壊れてるし。
Socketを使ってPOPサーバへ接続したら欠けてないんですけどね。
>>597 サーバソフトウェアはどんなの使ってるの?
>>598 メールサーバーソフトウェア?
それ分からないけど。
って事は、Net::POP3に問題無いって事なのかな。
>>599 いや、わからんけど、
Net::POP3 みたいなメジャーなモジュールに問題があるとは考えにくいので、
普通は自分の実行環境の方に問題がないかというところから攻めて行くっしょ。
添付の最初の1バイトなのか、添付の前の部分の最後の1バイトなのか。
602 :
デフォルトの名無しさん :2005/11/29(火) 21:50:44
Win32::OLEモジュールを使ってファイル選択ダイアログを表示させ、 選択したファイルの名前を変数に設定するにはどうすればいいの?
>>600 学内だし、SMTPもPOPも同じはず。。。?
でも、壊れたり壊れなかったりなんですわ。
添付内容が変わるだけの定型文のメールだし。
>>601 添付の最初の1バイト。
添付ファイルに該当する部分の最初の1バイトです。
ヤバイ部分をふせてソースをアップしてくれないか
605 :
デフォルトの名無しさん :2005/11/29(火) 22:58:55
perlのsystem関数とかで passwdなどのパスワード入力を後から聞いてくるタイプのコマンドは どうやって送ればいいのでしょうか? よろしくです
>>604 こんな感じ。
って、ほとんどなにもいじってないけど。
------------------------------------
use Net::POP3;
$pop = 'popサーバ';
$u = 'アカウント';
$p = 'パスワード';
my $oPop = Net::POP3->new($pop);
$oPop->login($u,$p);
my $rhMsg = $oPop->list();
foreach my $sMsgId (keys %$rhMsg) {
print @{$oPop->get($sMsgId)};
}
>>606 それで再現すんの?俺の手元じゃ再現しないぜ。
>>587 ちょwwww 大ボスたおしとくwwwww
if ( $A == 1 ) { $C += 3; $D += 4; }
elsif ( $A == 2 ) { $C += 100; $D += 40; }
>>609 大ボスは倒しても形態を変えて再登場するのが普通
これでいいよ if ( $A == 1 ) $C += 3, $D += 4; elsif ( $A == 2 ) $C += 100, $D += 40;
>>606 それだけのプログラムで欠けるというのはかなり不思議だね。
バグかもしれないのでがんばって追求すると楽しめそう。
オレのところでは再現しないので残念だ。
614 :
デフォルトの名無しさん :2005/11/30(水) 09:27:44
Perlでディレクトリの容量を調べる方法を教えてください UNIX鯖の場合とWIN鯖の場合を教えてください
>>615 なんでWebProg板なの?
別にここでもいいと思うんだけど
>>616 =
>>614 うるせーよカスムシが
それぐらい自分でしらべろや。
大体なんで鯖なんだよ、鯖ならwebprog板いけよ低脳、Perlスレがあること自体
板違いなんだよ。自覚しろや
opendir(DIR,shift @ARGV);
@dir=readdir(DIR);
foreach(@dir){print "$_\n";}
俺は616じゃないんだが。 勝手に決め付けないでね中学生さん
s/616/614/
620 :
617 :2005/11/30(水) 11:40:01
>>618 ならコード書けばいいだろうが うるせーよ無職ニートがなんでこんな時間に2chいるんだww 俺は授業だけどな opendir(DIR,shift @ARGV); @dir=readdir(DIR); $dirsize=0; foreach(@dir){ print "$_ "; $size=-s $_; print "$size\n"; $dirsize+=$size; } print "--- dirsize $dirsize\n";
何コイツ・・・?
>>614 試してないから自信ないが…。
print dirSize(".");
sub dirSize {
my ($dir) = @_;
my $sum = 0;
$sum += (-d)? dirSize($_): -s for glob("$dir/*");
return $sum;
}
関数ごと渡してサブルーチンを他のcgiから読み込むって可能? 読み込み方教えてください。 それと超がつくほど初心者な質問ですが、 文字関数で日本語の文字列を全角500くらいを扱えるのを 定義するにはどうすればいいですか?
もう少し分かりやすく質問お願いします
627 :
デフォルトの名無しさん :2005/11/30(水) 12:40:59
例えば a.cgiをメインに使っていて、そこから$SUMとかの関数を 同じディレクトリの 中にあるb.cgiに渡して、b.cgiの&keisanというサブルーチンを実行して、 そのサブルーチンから、また a.cgiにkeisanから弾きだされた結果を送るということなんです。 なにせ、そのkeisanがあまりにも長いためメインのa本体と別にしたいなと思いまして
a.cgiで use b.cgi とかけばいいだけだろ
629 :
デフォルトの名無しさん :2005/11/30(水) 12:42:54
>>626 さん
あ、私が意図したものは
$kekka="あなたは非常に素晴らしいです・・・・・(ここに入る日本語の文字列が500文字を超えるという意味です)"
↑のように""の内容が非常に膨大な文字列のときに適した文字列関数ってなんですか?
630 :
デフォルトの名無しさん :2005/11/30(水) 12:43:36
>>628 そんなことできるんですか?ちなみにa.cgiの変数はそのまま継続して使えるのですか?
定義すれば?
文字列関数ってなによ 釣りなら帰れ
例えばb.cgiにたくさんサブルーチンあったら、どれを実行とか出来ませんか?
634 :
デフォルトの名無しさん :2005/11/30(水) 12:50:47
釣りじゃありません。ほんとうに教えてほしいんです
>>634 すまんが、日本語を先に勉強してきてくれ。
636 :
デフォルトの名無しさん :2005/11/30(水) 12:55:06
もしかして a.cgiで use b.cgiして &&keisan();をすればいいだけですか!? そうすると普通に a.cgiに記述されていた場合と同じ結果になるのかな?
637 :
デフォルトの名無しさん :2005/11/30(水) 12:55:53
もう1つ聞きたいのが、500文字以上の全角文字を変数に入れたいんですが、 どうすればいいですか?
代入
>>618-619 脳内置換したら名前欄が614になっちゃって、しばらくおかしいなと考え込んだ件
>>614 Filesys::DiskUsage
>>624 >>1 > CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
いや、煽りとかじゃなくマジで。
二つ目は、普通に文字列を変数に入れれば良いんじゃないかな。長さは関係ないわけだが…
CGIから受け取った云々というのならそれもWebProg板行き
640 :
デフォルトの名無しさん :2005/11/30(水) 13:02:48
>>639 ありがとう!!!
文字数の長さは関係ないんだね!!ありがとー
641 :
デフォルトの名無しさん :2005/11/30(水) 19:00:49
性別 回答者合計者○($SEXSUM)名中 男○($SEXMALE)名 女○($SEXFEMALE)名 というのをHTMLで出力したいんだけど、ディレクトリに SEX.txtというのを置いて そのtxtファイルの中に「 0,0 」 というふうに男女の初期値の人数をいれておいて。 毎回フォームから'GENDER'の値が0(男性).もしくは1(女性)で送ってきた時のみ。 SEX.txtを読み込んで、1足して表示→そして読み込んだSEX.txtの人数の一人プラスという ようなPERLスクリプト分かる人いますか?
はい。僕分かります。
643 :
デフォルトの名無しさん :2005/11/30(水) 19:03:49
おしえてください
自分で作らないなら丸投げスレへ。
こんな感じ?試してないからちゃんと動くか分からん。 open(my $fh, "+<セックス.txt") or die $!; my ($males, $females) = split(/,\s*/, <$fh>); seek($fh, 0, 0); ($GENDER)? $males++: $females++; print $fh ("$males, $females");
うわあああスミマセン!携帯でのらくらやっててリロードし忘れたorz
完全な答えになってないから許す ってか携帯でコード書くなんて珍しいな・・
マルチして、すいませんでした。 どうしても今すぐ知りたかったので・・・
完全回答になってんじゃん
スミマセン…。
>>613 >>622 自力で再現できないんで、原因不明ですわ。
メールのヘッダとか見てても、他のメールとさして違いないんだけど・・・
今日、SocketとMIME::Parser使って作りなおしました。
こいつを育てます。
いろいろありがとう。
はいはい次の質問どうぞ
>>641 WebProg板の方に答え書いといたよ
質問マダァ-? (・∀・ )っ/凵⌒☆チンチン
Perl6はいつでるのですか?
あなたに孫が出来る頃
txtファイルに6つの変数(0, 1, 2, 3 , 4, 5)記録しておいて それを $Gに読み込んで そこまでは分かるんだが my ($A, $B, $C, $D, $E, $F) = split(/,\s*/, <$G>); というように。 このあと読み込んだ6つの数字を全て0, 0, 0, 0, 0, 0 にしたいので seek($G, 0, 0, 0, 0, 0, 0); としたら最初の2つ目の変数までは0に処理されるんだけど、3つ目以降の0からは エラー対象になります。 分かる人いますか?
>>661 そもそも何をを考えてるのかさっぱりわからん
>>661 seekの使い方が間違っています。
seekはファイルの読み書き位置を変更するものです。
本当ですね。自己解決しました。すれ汚しスマソ
>>661 エスパー翻訳:
6つの値をコンマ区切りで一行に書いたファイルがあって、それらの
値を一つずつ変数に読み込ませたい。ファイル名が $G 、ファイルの
内容が
0, 1, 2, 3 , 4, 5
だとして、
my($A, $B, $C, $D, $E, $F) = split(/,\s*/, <$G>);
でそれができると思う。
変数に読み込んだのち、ファイルの値は全て 0 に書き換えたいので、
seek($G, 0, 0, 0, 0, 0, 0);
としたら "Too many arguments for seek at ..." と怒られた。
どう書けば意図通り動くか分かる人いますか?
エスパー回答:
>>2 に載っている入門サイトや入門書を熟読せよ。
SEEK(○, (成功したときに返す値), (失敗したときに返す値)) だったんだね
クリア後の隠しボス登場
レベル低下の匂いがするぜ
みてみ、大ボスが形態変えて復活しとる。 ドラクエだとあと1,2回あるんだよな。MP温存しとかんとやられるぞ
回復魔法や薬草でもダメージ与えられるから問題なし。
ゾンビプロセスのことか
if ($AAA =~ /$BBB/) {・・・ $AAAが$BBBという文字列を含んでいるなら・・・ としたいのですがこのままだとエラーがでてしまいます。 どのように修正すればいいのでしょうか?
お前のエラーの内容など知らん。
676 :
674 :2005/12/01(木) 22:04:03
失礼しました、解決できました。。
平気でマルチしたり、解決法も言わずに自己解決しましたでハイサヨナラしたり、 なんかそういうのってどうなんだろうねえ?
679 :
677 :2005/12/01(木) 22:43:07
すみません。 LWP::UserAgentで、Basic認証をしたいのですが、どのようにコードを書けば良いのでしょうか。
>>689 「LWP Basic」で Google に Go!!
10 use LWP::UserAgent; 20 my $response = $request->authorization_basic($id, $pw); 30 goto google.com;
684 :
デフォルトの名無しさん :2005/12/02(金) 09:48:31
$STRの中に入っている文字列(配列なしの1つのみ)を出力する際に 20文字ごとに自動改行いれる方法わかる椰子いる?
685 :
デフォルトの名無しさん :2005/12/02(金) 09:50:13
ちなみに全角だから、厄介なんですよ、ハイ。。。
全角って分かってるなら40バイト置きに改行挿入すればいいだけじゃん
>>684-685 usu Jcode;
print jcode($str)->jfold(20)-euc();
<br>で改行したけりゃ
print jcode($str)->jfold( 20, '<br>' )-euc();
perl5.8.1以降なら第三引数に行頭禁則文字の配列リファレンスを渡せますが何か?
ちなみに既に改行がある場合は改行でsplitした配列に対して同様の操作が必要 ↓一行でできるわ。 print join /\n/, map{ jcode($_)->jfold(20)-euc() } split /\n/, $str;
689 :
デフォルトの名無しさん :2005/12/02(金) 10:09:02
ありがとんくす メール出力だから<BR>の代わりに\n にすればいいだけかな
691 :
689 :2005/12/02(金) 10:16:30
読んでみたけど分からない漏れは負け犬。。。
692 :
689 :2005/12/02(金) 10:46:12
本当、わからない # $str を $bytesバイトで折り返す require 'fold.pl'; while (length($str)) { (my $folded, $str) = fold($str, $bytes); print $folded, "\n"; } というソースを見つけたはいいものの、 $BODYというのに$STRに入ってる日本語の文字を40バイトごとで折り返して追加して いきたいんだけど、 print $folded, "\n"; のところを $body .= "$folded"; でいいかな?
693 :
689 :2005/12/02(金) 10:51:53
require 'fold.pl'; while (length($string)) { (my $folded, $string) = fold($string, 40); $body .= $folded, "\n"; } 一応出力されてメールは送ってくるけど、全角20時ごとに改行されていない なんでだろ
>>693 × $body .= $folded, "\n";
○ $body .= $folded. "\n";
>>688 なんで join の第一引数を /.../ にするんだろう.
意味ないと思うんだけど.
696 :
デフォルトの名無しさん :2005/12/02(金) 11:49:26
test.datというファイルにデータを書き込んでいるときに rename関数でtest.datを他のディレクトリに移動するとtest.datのデータは壊れますか? こういう場合もファイルロックをかけるんでしょうあ?
>>695 $_ =~ m/.../ の結果(空文字列 or "1")でjoinしたい気分だったとか?
>>696 環境依存。
renameが失敗するとか、renameが成功してファイルも無事だとか。
698 :
689 :2005/12/02(金) 13:19:58
>>694 ありがとう。でけた!ただ、やっぱり、この命令つかって
メール生成しても、多少ずれるのね orz
699 :
689 :2005/12/02(金) 13:25:22
これって句読点とかのせい?
700 :
689 :2005/12/02(金) 13:42:35
TERAPADのようなテキストエディタで表示すると20字ごとに改行はいってるのに メール(OE)だと、かなり毎行ずれてる orz
>>689 フォントのせいじゃないのか?
固定幅フォント使ってる?
702 :
689 :2005/12/02(金) 13:51:49
>>701 OEの設定の問題ってことかな?
OEの設定は
プロポーショナルフォント:MS Pゴシック
固定ピッチフォント:MS ゴシック
フォントサイズ:中
エンコード:日本語(自動選択)になってるよ
703 :
689 :2005/12/02(金) 13:53:15
>>701 それってさ、送信する段階で、相手のメーラーソフトがどんなものであれ、
ずれないようにして幅を統一させるようなことってできない?
ポカーン(゚Д゚)
HTMLメールで<pre>本文</pre>とでもすれば。
706 :
689 :2005/12/02(金) 14:03:57
perlの命令で文字フォントまで指定してメールを生成することって無理か。。。 HTML出力ならまだしも。。。。
707 :
689 :2005/12/02(金) 14:04:53
HTMLメールには出来ないんだなぁ。。。 リッチテキストスタイルにするとか、何かいい案はありませんか?
OSのAPIを使って文字幅を取得して、計算しつつ出力する
面倒だから画像ファイルにして添付しろ。
710 :
689 :2005/12/02(金) 14:13:36
>>708 すげぇ難しそう。画像ファイルを生成して添付しろとなもし?
普通、数とか文字列的なデータはCSVに生成して添付する方法なら簡単だけど、
画像の生成の仕方わからんw
つーか独り言書かれたりageて書き込むのが激しくウザいんだが 消えてくれないかな
なんでも人に聞く前に自分で調べろ、カスが
最近のメルマガや企業の広告のダイレクトメールなんかだと、 固定幅フォントで読むのを推奨する旨の注意書きを入れるケースが多いように思う。 つーか、ここから先は Perl 関係ないので余所でやって欲しい。
ActivePerlでUTF-16LE形式のファイルを読み書きすると文字化けする。 回避方法はありますか?
>>714 文字化けってのが理解できない。
BOM付きのutf16leが欲しいのに、
encode('utf16',decode('utf16',$input)) だとutf16beになって、
encode('utf16le',decode('utf16',$input)) だとBOM無しになるって事?
それなら、自分でencode前か後にBOMを追加すればいいはず。
719 :
デフォルトの名無しさん :2005/12/02(金) 18:52:45
sort関数を使っても昇順に並び替えができません @aaa=(10,25,35,69,190); @aaa2=sort(@aaa); foreach $_(@aaa2){ print "aaa=$_<BR>"; } 実行すると aaa=10 aaa=190 aaa=25 aaa=35 aaa=69 となってしまいます。 sort関数ではちゃんとできないんでしょうか?
@aaa2=sort({$a <=> $b} @aaa);
722 :
デフォルトの名無しさん :2005/12/02(金) 19:36:04
723 :
715 :2005/12/02(金) 20:14:58
>>721 もしかしてbinmode?
open($fh,"<:raw:encoding(utf16le)",$filename);
又は
binmode($fh,":raw:encoding(utf16le)");
あたりかと。
724 :
デフォルトの名無しさん :2005/12/02(金) 20:28:41
他のプロセスがファイルに書き込み中でもrenameって成功するんでしょうか?
>>722 >低脳な質問はWebProg板でしろ!!
ワラタ
>>724 実際にやってみろよ
それぐらいすぐできるだろ
>>724 それはOSによって違うかも。
UNIX系OSの場合はファイルオープン後は i-node (ファイルの内容を指す
位置情報のようなもの)しか見てないので幾らファイル名を変えようが
ハードリンク増やそうが関係ない。
perlをようやく5.6から5.8にアップしたんですが なんかバグがあるようです。 @a = ("aaa", "bbb","ccc") ような配列をprintすると、なんか aaa bbb ccc と、変な風にズレます。(ほんとはもっと高度なスクリプト) 5.6では問題なかったです。 一応報告まで。
それだけだと出力は aaabbbccc になるはずだが >(ほんとはもっと高度なスクリプト) ここを公開しないで何の意味があるのかね
>>728 あー、また文字列中に変数展開しているオチっぽいのがきたね。
> yjwebsearch.pl > (my $sec,my $min,my $hour,my $mday,my $mon,my $year) = localtime($y_modificationdate); これは あらての つりだ
高度なスクリプトて… 巡回セールスの完成コード入ってるとか?w
「高度なスクリプト」は高度である=バグが無い →Perl本体のバグだ という思考回路か
>>733 ウチにもいるぞー。
何かっつーとすぐOSやらGCCやら環境がバグってるって言い出すヤツ。
>>728 > と、変な風にズレます。(ほんとはもっと高度なスクリプト)
仕様です。
きっとその高度なスクリプトには、
「chomp していない値を放り込んだ配列をダブルクォート展開する」
というのっぴきならないニーズがあるんですね。
これは恐らくあなたの Perl 歴よりも長い歴史を持つ伝統的な FAQ なので、これを機会にしっかり覚えましょう。
SSL通信と●ログインに関する質問です。
http://kage.monazilla.org/system_DOLIB100.html を参考にして●ログインスクリプトをperlで書きましたが
ログインしようとするとエラーになります。
以下のものが作ったスクリプトです。
何かアドバイスをください。
#ログインIDとパスワードは伏字にしております。
use LWP::UserAgent;
use
HTTP::Request::Common qw(POST);
use
HTTP::Headers; my $ua = LWP::UserAgent->new;
$ua->default_header( 'User-Agent' => 'DOLIB/1.00'.$ua->agent );
$ua->default_header( 'X-2ch-UA' => 'kage/1.00'.$ua->agent );
$ua->default_header( 'Content-Length' => '36'.$ua->agent );
$ua->default_header( 'Content-Type' => 'application/x-www-form-urlencoded'.$ua->agent );
$ua->default_header( 'Connection' => 'Close'.$ua->agent );
# リクエストの生成
my $url = '
https://2chv.tora3.net/futen.cgi ';
my %formdata = ('ID' => 'XXXX%40xxxx%2ene%2ejp', 'PW' => 'XXXXXXXX');
my $request = POST($url, [%formdata]);
お前さんはエラーを書こうとは思わないのか。
>>739 すみません。
HTTP/1.1 200 OK
Connection: close
Date: Fri, 02 Dec 2005 14:47:54 GMT
User-Agent: Monazilla/1.00
Server: Apache/2.0.49 (Unix) PHP/4.3.6 mod_ssl/2.0.49 OpenSSL/0.9.7c-p1
Content-Length: 204
Content-Type: text/plain
Client-Date: Fri, 02 Dec 2005 14:47:52 GMT
Client-Peer: 206.223.147.50:443
Client-Response-Num: 1
Client-SSL-Cert-Issuer: /C=US/O=Equifax Secure Inc./CN=Equifax Secure Global eBu
siness CA-1
Client-SSL-Cert-Subject: /C=US/O=2chv.tora3.net/OU=
https://services.choicepoint. net/get.jsp?4135261678/OU=See www.geotrust.com/resources/cps (c)04/OU=Domain Con
trol Validated - QuickSSL(R)/CN=2chv.tora3.net
Client-SSL-Cipher: DHE-RSA-AES256-SHA
Client-SSL-Warning: Peer certificate not verified
SESSION-ID=ERROR:ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp
pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp
ppppppppppppppppppppppppppppppppppppppppppp
昔Perlで●ログインする関数を作った事あるが お前さん、LWP::UserAgentの使い方を間違えてないか
742 :
741 :2005/12/03(土) 00:30:31
使い方は間違えてないな、スマン これは経験からだが ●ログイン時の注意点 ・ID/PWをエンコードして渡すとエラーになる ・返ってきたsidの最後の\nをchop()で刈り取る コードはお前さん向けに編集するからまっとれ
743 :
741 :2005/12/03(土) 00:36:56
sub ch2_maru_login {
my($ua, $r, $sid) = ();
my($id, $pw) = @_;
$ua = LWP::UserAgent->new;
$ua->max_redirect(0);
$ua->agent('DOLIB/1.00');
$ua->default_header('X-2ch-UA' => 'Hoge/1.00');
$r = $ua->get('
https://2chv.tora3.net/futen.cgi?ID= ' . $id . '&PW=' . $pw);
if($r->is_success){
(undef, $sid) = split(/=/, $r->content, 2);
if($sid =~ /^ERROR/s){ return undef; }
chop $sid;
return $sid;
}else{ return undef; }
}
こんな感じかな
編集ミスとかあったらすまん
POSTではできないんでしょうかね・・・
>>743 を試してみたんですが
$r->contentに
SESSION-ID=ERROR:ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp
pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp
ppppppppppppppppppppppppppppppppppppppppppp
がはいってますね。うーん、どこが間違っているんでしょうか・・・
746 :
741 :2005/12/03(土) 01:01:19
うん。@は展開されるから気をつけような。 展開する必要がない場合は極力シングルクォートにしような。
749 :
721 :2005/12/03(土) 01:21:02
>>723 ありがとう。うまくいきました。
こんなに簡単にいくとは…
すみません、Perl始めて間もない者です。 while(<>) { if(/#BOOKTITLE#\((.+)\)/) { print $1, "\n"; } } というプログラムを以下のようにテキストファイルと併せて実行すると $ ./book.pl title.txt Book title 03 Book title 01 Book title 14 Book title 08 : : : と表示するプログラムなのですが、これを01から順にソートするにはどうすればよいのでしょうか? マッチ後にリスト配列へ入れてソートしていけばいいらしいのですが。
push(@buf, $1); ... print join("\n", sort(@buf));
途中で Book title 123 とか出てこないだろうな?
>>751 実行すると
$ ./book.pl title.txt
$
となるだけで、何も変化がありません。
>>753 は間違いです。
実行はできるのですがソートできていない結果が表示されてしまいます。
sub test ( ¥% ) { my ($ref) = ¥%_; $ref->{'fuga'} = 'World'; } %hash = ( 'hoge' => 'Hello', 'fuga' => 'Hello' ); &test ( %hash ); print $hash{'hoge'}, $hash{'fuga'}, "¥n¥n"; # sub test に対して連想配列をリファレンスで渡し、 # 渡した元データ自体を sub test 内で直接書き換え、 # 結果として HelloWorld と表示させたい場合、 # sub test 内では、どのようにデリファレンス/代入 # すれば良いでしょうか? # 現状のこの記述では上手くいきません。 # 力を貸してください。宜しくお願いします。
sub test ( ¥% ) { my ($ref) = ¥%_; $ref->{'fuga'} = 'World'; return %$ref; } %hash = ( 'hoge' => 'Hello', 'fuga' => 'Hello' ); %hash2 = &test ( %hash ); print $hash2{'hoge'}, $hash2{'fuga'}, "¥n¥n";
sub test { my $ref = shift; $ref->{'fuga'} = 'World'; } %hash = ( 'hoge' => 'Hello', 'fuga' => 'Hello' ); &test(\%hash); print $hash{'hoge'}, $hash{'fuga'}, "\n\n";
758 :
755 :2005/12/03(土) 02:40:59
>>756 素早い解答ありがとうございます。
実は、メモリ節約を模索しておりまして、
引数を丸ごと渡さずに済ませる方法を考えているのです。
説明足らずですいません。
配列で書くと、以下のような感じです。
これを連想配列で行いたいと思っているのです。
sub test ( ¥@ ) {
$_[1] = 'World';
}
@array = ('Hello', 'hello');
&test ( @array );
print $array[0], $array[1], "¥n¥n";
759 :
755 :2005/12/03(土) 02:48:46
>>757 まさにソレです。
ありがとうございました!
shift は、複数の引数を順に取り出す時ばかり使用していて、
頭が行きませんでした。
それから、引数を与える側の ¥ は、プロトタイプ宣言によって
解釈されるものだと、おもいっきり勘違いしておりました。
感謝です。
@array = (); while (<>) { push @array, $1 if /#BOOKTITLE#¥((.+)¥)/; } print join ("¥n", sort @array), "¥n";
まあええことよ
質問マダァ-? (・∀・ )っ/凵⌒☆チンチン
最近、夫の帰りがひどく遅いんですが…
ちんこにパールを埋め込むか迷ってます
CPANモジュールをインストールすれば問題有りません
perlがrubyより劣っているところを教えてください
>>767 普通、パールはルビーより値段が安いな。
劣ってるところはそれだけw
BEGINブロック内でCORE::GLOBALの操作によりbuilt-in関数の置き換えを行っているのですが、 既にロードされたモジュールに対しては効果が無いようです。 現在はスクリプトの一番初めにロードすることで対処していますが、 後からロードしても大丈夫なような回避方法は無いでしょうか。
Pugsどうよ?
下のように書いているのだけど、ファイルの読み込みができません。 環境はActivePerlです。 #! /usr/bin/perl use utf8; use Encode; use File::Find; @ARGV = ('.') unless @ARGV; sub process_file{ $file = $File::Find::name; open IN, "<encoding(cp932)", "$file" or die; ... 以下略 } find(\&process_file, @ARGV);
>>770 Pugs 入れようとしたら GHC のインスコで疲れた…
773 :
769 :2005/12/03(土) 20:47:03
すみません、訂正させてください。読み直したら説明文が意味不明でした。
現在、
>>769 のようなbuilt-in関数の置き換えを行う必要のあるモジュールを作っています。
現在はそのモジュールを、スクリプトの一番初めにロードすることで対処していますが、
それを後からロードしても大丈夫なような回避方法は無いでしょうか。
宜しくお願いします
>>771 : が抜けているようだが。("<:encoding(cp932)")
use utf8;ってことはスクリプトの文字コードはUTF-8にしてるのか。
775 :
771 :2005/12/03(土) 21:04:55
>>774 その部分を修正しましたがが、: の有無は関係ないみたいです。
多言語処理を考えているので、意図的にスクリプトの文字コードをUTF-8にしています。
778 :
771 :2005/12/03(土) 21:54:02
>>777 それも除外しています。色々と試しているんですが、subで
print $File::Find::name,"\n";
と追加して、
c:\home>test.pl test
とやると、
test
とのみ出力して、open INのところで落ちてしまいます。
testは同じ階層にあるフォルダで、中に処理対象のファイルを2つ入れています。
findの書き方が悪いのか?とも思っているんですが…
779 :
デフォルトの名無しさん :2005/12/03(土) 22:19:32
>>778 > findの書き方が悪いのか?とも思っているんですが…
思ってないで調べろよ。
ディレクトリをopenか。
print $File::Find::name,"\n"; じゃなくて print $file, "\n";
782 :
771 :2005/12/03(土) 23:28:21
原因判明。 findがファイルもフォルダも区別してなかった。 そのため、最初に$File::Find::nameにフォルダ名が入ってopenで落ちたみたい。 ファイルかフォルダかを判別するif文追加して回避した。
>>782 気付くの遅いよ。
>>780 で答え出てるのに。
しかし、use utf8;やuse encoding "cp932";すると日本語ファイル名がまともに
扱えないのはなんとかならんのかな。
s///にはなぜ/cオプションがないんですかね・・・。
>>784 (?!exp)っていう拡張構文があるから?
ActivePerl 5.8.7 bulid + Tkで fork文を宣言するだけでコマンドプロンプトから落ちるのだけど プログラムの問題だよね・・・?そんな仕様ないよね。
ActivePerlでforkってできるの?
788 :
デフォルトの名無しさん :2005/12/04(日) 17:19:22
え?使えないの?UNIXだけ?
ラクダ本にはwindowsでも頑張ってforkを実装した、って書いてあった
>>786 コマンドプロンプト「から」落ちるって、どういう事?
後、forkという記述があるだけで駄目なの?
>>532 ,543 あたりだと、メインループが走った後の実行は駄目っぽいが...
(Windowsでのforkはスレッドによるエミュレーション)
791 :
デフォルトの名無しさん :2005/12/04(日) 19:26:42
リスト内の要素をランダムに並べ替える方法はありますか? @aaa2=rand(@aaa); だとうまくいきません。 教えて下さいよろしくお願いします。
※低脳な質問はWebProg板でお願いします
795 :
786 :2005/12/04(日) 22:02:09
>>790 ちょっと今から試してみます。
あとで結果報告。
ありがとうございました。
796 :
デフォルトの名無しさん :2005/12/04(日) 22:03:59
Perlで出来て Cで出来ない例を挙げてみてください
797 :
786 :2005/12/04(日) 22:22:05
御指摘の通りMainLoopがあると簡単なプログラムでも 問題が発生したため、Perl Command Line Interpreter を終了します。 ご不便を おかけして申し訳ありません。 とでて落ちるみたいです。原因が分かりました。 どうもです。
>>796 PerlはCで書かれているのでそのようなものは存在しません
目的で言えばそうだけど、手段で言えばいっぱいあるな。 配列やハッシュのPerlのイデオムは、Cの文法じゃかけない。
>>796 メモリの確保、解放、踏み越えを気にしない事
極端な話、perlインタプリタを全部ライブラリとして組み込んで main() { perl("任意のperlプログラム"); } とかすりゃなんでもアリだからなぁ。これをCプログラムと呼んでいいか どうかは知らんが。 結局楽に書けるかどうかが違うだけでできることは本質的に同じなんだし。
>>801 適当なsample.plをつくって、
main () {
perl("sample.pl");
}
として、sample.cで保存したら実行できるんですか?
>802 よく読め。 「perlインタプリタを全部ライブラリとして組み込ん」だ場合の話だ。 >801 とは少し違うかもしれないが 「perlcc -c sample.pl とやると sample.c ができる」 と説明したら理解できるか?
804 :
デフォルトの名無しさん :2005/12/05(月) 07:38:24
CPANを利用してモジュールをインストールする際に エラーが出てインストールできませんでした。 どうすれば正しくインストールされるのでしょうか?
805 :
804 :2005/12/05(月) 07:46:47
インストールしようとしたモジュールは"Schedule::At"で、 エラーメッセージの一部は以下の通りです。 t/t1....ok 1/6Can't exec "atq": そのようなファイルやディレクトリはありません at /root/.cpan/build/Schedule-At-1.06/blib/lib/Schedule/At.pm line 96. Schedule::At: Can't exec getJobs command: そのようなファイルやディレクトリはありません
エラーが出ないようにすること、かなぁ。
807 :
デフォルトの名無しさん :2005/12/05(月) 11:13:55
$db=DBI->connect("DBI:mysql:DB名:ホスト名","ユーザー名","パスワード", {RaiseError => 0,PrintError => 1}); if(!$db){ print"接続失敗\n"; exit; } これで、接続失敗と出てしまうんですが。文法的な間違いはありますか? 文法的な間違いがないとしたら何が原因にあげられるでしょうか? どなたかご教授お願いします。 (サーバーにmysqlはインストールされています。ユーザ名、パス等もあってると思われます。
perlでアクセスする前にmysqlに直接アクセス出来てるかどうか確認
809 :
ヽ(´ー`)ノ ◆.ogCuANUcE :2005/12/05(月) 12:05:39
age てもた。スマソ
811 :
デフォルトの名無しさん :2005/12/05(月) 15:41:28
許しません
812 :
デフォルトの名無しさん :2005/12/05(月) 16:48:25
俺に免じて許してあげてください
許すよ
814 :
デフォルトの名無しさん :2005/12/05(月) 17:38:40
質問です。 10文字のアルファベットa,b,・・i,jを0,1,2のいずれかに変換し、すべての組み合わせ (3の10乗通り)を配列に格納したいのですがどのように書けばいいかわかりません。 なにぶん初心者で苦戦しております。わかる方がいらっしゃいましたら教えていただきたいです。
>>814 「a,b,・・i,jを0,1,2のいずれかに変換し」
の意味がわからんな。
つか、アルファベッと数字、独立してね?
変換する意味あんの?
816 :
デフォルトの名無しさん :2005/12/05(月) 18:08:39
3 ** 10 のパターンを列挙するだけじゃね? なんか宿題くさいが。
こんなんかな。 use strict; use warnings; use Data::Dumper; my @nPRk = ([]); foreach (1 .. 10) { @nPRk = map { my $__ = $_; map { [ @$__, $_ ] } (0 .. 2); } @nPRk; } my @result = map { my %hash = (); @hash{'a' .. 'j'} = @$_; \%hash; } @nPRk; print Dumper(@result); 適当なので真面目にやるなら Math::Combinatorics でも使った方がいいと思うがね。
818 :
814です :2005/12/05(月) 19:17:46
>815さん 変換というか、置換ですね申し訳ないです。 とくに0,1,2にこだわるわけではなく3つのグループに振り分ける組み合わせ が知りたかったんです。
>>818 a,b,・・i,j から3つ選んで (a, b, c) というリストを作る。
このリストのすべての組み合わせを作れ。
ってことか。
(a,a,a)とか同じ文字が入るのはだめなのか?
>>818 何をどうしたいのか分かんねぇよ。
もうちょっと分かる様に説明しろや。
エスパー募集中
残念、今日は仁丹が切れていたようだ
>>797 一応、systemやopenは大丈夫だし、
予めforkしておけば、Tkを使ってない側ではforkし放題だけどね。
なぜか、スレッドは予め生成してても駄目。
>>814 ほらよ、
@table = (
{a=>0,b=>0,c=>0,d=>0,e=>0,f=>0,g=>0,h=>0,i=>0,j=>0},
{a=>0,b=>0,c=>0,d=>0,e=>0,f=>0,g=>0,h=>0,i=>0,j=>1},
{a=>0,b=>0,c=>0,d=>0,e=>0,f=>0,g=>0,h=>0,i=>0,j=>2},
{a=>0,b=>0,c=>0,d=>0,e=>0,f=>0,g=>0,h=>0,i=>1,j=>0},
:(中略)
{a=>2,b=>2,c=>2,d=>2,e=>2,f=>2,g=>2,h=>2,i=>2,j=>2} );
課題は変換表を作るコード臭いが、質問の答えならこれで充分だろ。
コピー&ペースト&置換の繰返しだと、全要素完成まで10分程度かな。
824 :
デフォルトの名無しさん :2005/12/05(月) 23:57:44
ちょっと難しい質問かもしれませんが、 パチスロのシミュレータを作っていまして、65536までの整数の乱数を発生させています。 (そのうちの50までが当たりなどというシステムです。) しかし、 $rand=int(rand 65536); では何故か片寄ってしまいます。 srand(time()^($$+($$<<15))); を記述しても片寄ります。 どんな方法で乱数を発生させているのかは把握していないのですが、 本当にランダムな整数を発生させるような方法がわかるかたがいたら教えて下さい。 (もちろん「本当にランダム」ということはあり得ないことはわかっていますが)
「片寄ってる」ってどういう状態なのかくわしく
826 :
デフォルトの名無しさん :2005/12/06(火) 00:17:50
片寄ってませんでした。勘違いですいません。
ときどきいるんだよ。1から100までの乱数を発生させているのに、 100回出力する前に同じ数字が2度出てきました。このプログラム 壊れています!!! と叫びながら下半身裸で飛び出してくる奴が。
828 :
814です :2005/12/06(火) 00:26:38
みなさんどうもすみません&ありがとうございます。 >819さん わかりづらくてすいませんでした。 たとえば(a,b,c,d,e,f,g,h,i,j,)→(0,1,0,0,2,2,1,2,0,2) のようにしたかったのです。
>下半身裸 詳しく
831 :
デフォルトの名無しさん :2005/12/06(火) 01:35:14
>>827 高校の数学の問題なんかにあるね。
「1から10までの乱数を10個発生させたときに、同じ値がひとつも
存在しない確率はどれくらいか?」
10の階乗 ÷ 10の10乗 = 0.00036288
どこまで実装するかによるけど、パチスロのシュミレータなら乱数じゃな くて Time-HiRes でタイミング依存にした方が実機に近いかもしれないね。
>>830 ∧ ∧
〃⌒ ヽl|l) …ぅぉぇっぷ
/ rノ ;
Ο Ο_)***
質問です。 今、perlでgoogleを使用して検索しようとするプログラムを 作ろうとしているですが、(IEやmozillaなどのブラウザを立ち上げずに) Googleの入力フォームに検索したい文字列を代入して、 検索させるうまい方法が思い付きません。 Yahooニュースなどから、キーワード(国内、海外、経済etc)以下の それぞれのトッピックを抜き出したりするなど、すでに記述されて いる文章を読み込み、出力させることなどはできるのですが、 ポータルサイトなどで、検索して、検索結果を出力させるには どうすればいいかわからず困っているので、知識をかしてください。
>>814 頭の体操のつもりが、やっつけ仕事気味なんだけれど、
モジュールを使わず組んでみました。
このスクリプトでは、55980通りの結果が出ました。
#! /usr/bin/perl -w
$cols = 10; $total = 0; $result = '';
sub three (¥$¥@) {
my ($digits, @totals) = @_;
if (length $digits == $cols) {
if ($totals[0] > 0 && $totals[1] > 0 && $totals[2] > 0) {
$result .= $digits."¥n"; $total++;
}
return;
}
else {
for (my $i=0; $i<3; $i++) {
$totals[$i]++; &three($digits.$i, @totals); $totals[$i]--;
}
}
}
&three('',(0,0,0));
$total = "total count: $total¥n";
print $total;
open(OUT, '>'.$ENV{'HOME'}.'/result.txt');
print OUT $result, $total;
close(OUT);
補足 ちなみに、3つのグループに分かれていない組み合わせは排除しています。 「if ($totals[0] > 0 && $totals[1] > 0 && $totals[2] > 0) {」の行と、 その2行下の「}」をコメントアウトすれば、1または2つのグループに しか分かれなかった結果も出力します。(その場合、54049通り)
あら。pm のときのクセが。
タイポ…。
>>839 > ×(その場合、54049通り)
> ○(その場合、59049通り)
842 :
デフォルトの名無しさん :2005/12/06(火) 05:34:32
乱数について尋ねた者ですが、そんな単純な事ではありませんでしたよ。まあ自己弁護。
>>842 同じ「乱数」だからということで
パチスロの乱数ロジックを再現できると勘違いして
自己弁護している香具師発見。
重度のスロッター発見
パチスロにしろフィーバーにしろ乱数に依存していない罠。 純粋に乱数使うとでんでん面白くない罠。
846 :
デフォルトの名無しさん :2005/12/06(火) 08:01:30
ふうむ。そのロジックとやらを教えてちょんまげ。
ぷぷ
もう逃げるのか・・・
はいはい、低脳なやり取りはWebProg板でどうぞ
もう一度いう おれは天才だ! うわらば
>>849 ロジックを示せないからって
唐突に両成敗を狙うのは不自然すぎますよ(^^)
852 :
835 :2005/12/06(火) 11:49:43
アムロが乗るやつだぞ
化粧品メーカーでしょ?
アムロが乗ったのはSAMだよね?
はいはい、低脳なやり取りはWebProg板でどうぞ
フリーダム
859 :
デフォルトの名無しさん :2005/12/06(火) 20:05:37
頭悪い質問ですみません。 ActivePerlなんですけど、ppmでモジュールをインストールして、 ----- BEGIN { unshift (@INC, ".."); } use 〜(インストールしたモジュール名) ; ----- とかやっても Can't Locate 〜(モジュール名)in @INC〜 と怒られてしまいます。 うまく行くときといかないときがあってよく分かりません。 何が原因かお分かりの方がいらっしゃいましたら、ご教授ください。
860 :
デフォルトの名無しさん :2005/12/06(火) 20:14:50
>>859 の補足です。
うまく行くときと行かないときと言うのは、前にもやったんですけど
できなくてぐちゃぐちゃやってるうちに、
いつの間にかできるようになってたということです。
ファイル自体はきちんとsite/lib/に出来ています。
実行cgiと同じディレクトリわざと置いても認識しません。
>>859-860 再現性の無い不具合の解決方法は君にしか分からない。
site/lib/ は始めから @INC に登録されているので、わざわざ
親ディレクトリを追加したりモジュールのファイルを移動させる
必要はない。
862 :
デフォルトの名無しさん :2005/12/06(火) 20:24:15
>>861 レスありがとうございます
ということはBEGIN以下は不要ということですね。
(といっても変えても状況は変わりませんが・・・)
もう少しいろいろやってみます。
どうもありがとうございました。
エラーメッセージの省略した部分にどのファイルをさがしたかと そのときの@INCの内容がかかれているはずだから、そこにファイルが あるかどうか確認するのが基本。わけもわからず適当にいじっても 時間の無駄というものだ。
864 :
デフォルトの名無しさん :2005/12/06(火) 23:03:03
んで、乱数のロジックがわかるなら教えてくれよ。
>>864 1)種を与える
2)種をアドレスとして適当なところを読んで乱数値とする
3)読んだデータを次の種にする
866 :
デフォルトの名無しさん :2005/12/07(水) 06:36:29
もっとわかりやすく具体的に滑舌よく。
867 :
デフォルトの名無しさん :2005/12/07(水) 07:06:44
もっと力強く明日への希望を込めて。
確かにActivePerlのPPMって動作変。 動く人ってどう設定してるんだろう。 インストールしてそのままでも動いたためしない。
>>869 上書きインストールじゃないのは当然ですよ。
それにドキュメントとか全く関係ないレベルで動作しないんだよね。
仕方ないから普段はモヂュールは使わない、仕方なく使うときは
手動でインストールしてるよ。
上書きインストールしても普通に動いてる俺って・・(´・ω・)
Cygwin perlでいいじゃん???
ActivePerl普通にインストールして普通に動いてるんだが
>>871 >>873 普通は上書きインストールでも問題無く動くよ。複数ヴァージョンを
同時に使う方がレジストリ設定の奪い合いでおかしくなったりする。
>>872 Perl だけの為に Cygwin 入れるなら ActivePerl の方がスマートだし、
Tk や Win32 関係のモジュールが最初から付いてくるし、コンパイラを
用意していない環境でも PPM でバイナリがインストールできる。あと
Cygwin だと改行コードの自動変換に絡む要素が一つ増えるから、
その分トラブルシューティングが面倒になる。
これらを考慮の上で Cygwin Perl を使うメリットの方が大きい人は
Cygwin Perl を使えばいいんじゃないかな。
あれ? use strictしたらヒアドキュメントが使えなかったはずなのに いつの間にか使えるようになってる 俺の勘違いだったのかなぁ
> use strictしたらヒアドキュメントが使えなかったはずなのに ( Д )゚ ゚
(「・ω・)「アンチョビー
>>870 んな不具合あるわけねーべ。 どう考えたっておたくの環境問題だべ。
879 :
デフォルトの名無しさん :2005/12/07(水) 22:35:36
プログラムを実行すると、 Wide character in subroutine entry at C:/Perl/lib/Encode.pm line 166. とエラーが返ってくるのですが、どうも原因が分かりません。 プログラムを載せるので、原因を指摘していただけないでしょうか?
880 :
デフォルトの名無しさん :2005/12/07(水) 22:36:39
usestrict;
useLWP::UserAgent;
useHTML::TokeParser;
useURI;
useencoding 'shiftjis';
binmode(STDERR, ':raw :encoding(shiftjis)');
useEncode;
my $baseURL = '
http://search.auctions.yahoo.co.jp/jp/search/auc ';
my $keyword = shift @ARGV || die;
my $threshold = shift @ARGV || die;
my $ua = LWP::UserAgent->new;
my $url = URI->new($baseURL);
$url->query_form(
p=> encode('euc-jp', $keyword),
auccat=> '0',
alocale=> '0jp',
acc=> 'jp'
);
881 :
デフォルトの名無しさん :2005/12/07(水) 22:37:36
my $response = $ua->get($url, 'Accept-Language' => 'ja,en'); while ($response ->is_success){ my $content = decode('euc-jp', $response->content); my $stream = HTML::TokeParser->new (\$content) or die "\n"; while (my $tag = $stream->get_tag('td')){ last if $tag->[1]{colspan} && $tag->[1]{colspan} eq '5'; } while (my $tag = $stream->get_tag('td')){ next unless $tag->[1]{align} && $tag->[1]{align} eq 'left'; $tag = $stream->get_tag('a'); my $descURL = $tag->[1]{href}; my $productName = decode('shiftjis', $stream->get_trimmed_text('/a')); while ($tag = $stream->get_tag('td')){ last if $tag->[1]{align} && $tag->[1]{align} eq 'right'; } my $currentPrice = decode('shiftjis', $stream->get_trimmed_text('/td')); my $currentP = $currentPrice; $currentP =~ s/[, 円]//g;
882 :
デフォルトの名無しさん :2005/12/07(水) 22:38:13
if ($currentP < $threshold){ my $description = $ua->get($descURL, 'Accept-Language' => 'ja,en'); $description = decode('euc-jp', $description->content); my ($reservedPrice) = $description =~ m!希望落札価格:</b></td><td bgcolor=ffffcc><b>(.*?円)!mis; $reservedPrice = '-' unless($reservedPrice); my ($deadline) = $description =~ m!<tr><td>終了日時:</td><td>(.*?分)!mis; print "$productName\n ($descURL)\n"; print " $currentPrice ($reservedPrice) : $deadline\n\n"; } } $content =~ m!<a href="([^"]+)">\n次の\d+件!mis; my $nextURL = URI->new_abs( $1, $baseURL); $response = $ua->get($nextURL, 'Accept-Language' => 'ja,en'); }
883 :
デフォルトの名無しさん :2005/12/07(水) 22:39:32
sub URI::query_form { my $self = shift; my $old = $self->query; if (@_) { my @query; while (my($key,$vals) = splice(@_, 0, 2)) { $key = '' unless defined $key; $key =~ s/([;\/?:@&=+,\$\[\]%])/$URI::Escape::escapes{$1}/g; $key =~ s/ /+/g; $vals = [ref($vals) ? @$vals : $vals]; for my $val (@$vals) { $val = '' unless defined $val;
884 :
デフォルトの名無しさん :2005/12/07(水) 22:39:58
my @work = unpack('C*', $val); $val = ''; foreach my $c (@work) { if((($c >= 0x30) && ($c <= 0x39)) || (($c >= 0x41) && ($c <= 0x5A)) || (($c >= 0x61) && ($c <= 0x7A))) { $val .= chr($c); } elsif ($c == 0x20) { $val .= '+'; } else { $val .= sprintf("%%%02X", $c); } } push(@query, "$key=$val"); } } $self->query(join('&', @query)); } return if !defined($old) || !length($old) || !defined(wantarray); return unless $old =~ /=/; map { s/\+/ /g; uri_unescape($_) } map { /=/ ? split(/=/, $_, 2) : ($_ => '')} split(/&/, $old); } #終わりです。お願いします。
色々と突っ込みどころはあるが、まず >C:/Perl/lib/Encode.pm line 166. って書いてあるんだから、Encodeの関数の使い方に問題があるってのは分かるだろ 関係ないゴミソースを延々と載せるな
886 :
デフォルトの名無しさん :2005/12/07(水) 22:56:14
すみません。Encode関数の使い方もどこがまちがっているのかがいまいち分かりません。
decode関数の使い方を間違えとる from_toでGuess使え
888 :
デフォルトの名無しさん :2005/12/07(水) 23:15:13
ご指摘ありがとうございます。 すみませんが、具体的にどの場所でどう使えばよいのでしょうか?
decode関数使ってるところを、from_toに置き換えろってこと use Encode qw{from_to}; use Encode::Guess qw{euc-jp shiftjis 7bit-jis utf8};
890 :
デフォルトの名無しさん :2005/12/07(水) 23:29:38
useを
>>889 のようにし、decodeをfrom_toに置き換えたのですがうまくいきませんでした。
置き換えたことによって他に書き換える部分はあるのでしょうか?
まさか s/decode/from_to/g しただけじゃないだろうな・・
892 :
デフォルトの名無しさん :2005/12/07(水) 23:46:26
申し訳ありませんがfrom_toの使い方自体がよくわかりません。 いちおう参考書の通りのプログラムなのですが・・・
まず参考書を窓から投げ捨てるところから
894 :
デフォルトの名無しさん :2005/12/07(水) 23:55:27
このまま実行してもうまくいくはずないですか?w
初心者にencodingプラグマの使用を勧めてる時点でまともじゃなさそうだな…
896 :
デフォルトの名無しさん :2005/12/08(木) 00:06:54
学校で正規表現を一応理解して、次に与えられた選択課題がこれなんですが…
おい、CGIスレっぽくなってきたぞ。
上等だ
900 :
:2005/12/08(木) 02:12:08
perlでの辞書の作り方をおしえてください。 文字を入力するとファイルの中からそれの説明文がでてきて、対象がない場合は ファイルに説明文を登録できるようなかたちのやつを。
902 :
:2005/12/08(木) 02:33:00
>>896 その手の学校のテキストはまず使い物にならんよ
学校で習う オシベとメシベぐらい概念だけで役にたたん
学校wwww何を想像して物言ってんだコイツwwwww 恥知らず NEET ウザスwwwwwww
907 :
デフォルトの名無しさん :2005/12/08(木) 15:16:35
文字列で2文字以上同じ文字が連続した部分だけ1文字に置換する方法を教えてください
>>907 こういう質問ってなんだ?
わざとなのか?ネタなのか?
911 :
デフォルトの名無しさん :2005/12/09(金) 00:00:30
perlでソースビューワーを作りたいんですがどうもうまくいきません お力お貸しください。
つ perl -pe'' source.c
つ 行番号付き perl -ne 'printf "%4d|%s",$.,$_' source.c
そっちも大して変わらない件について
>>916 そうやって説明を放棄するのはよくない傾向
いいから、perlの話をしろ。
919 :
915 :2005/12/09(金) 20:56:31
はは、WebProg板を見てる俺にとっては何ともないぜ
むかしむかしあるところに
単品の話題を扱ってるスレと質問スレを比べる意味が分からん。
922 :
デフォルトの名無しさん :2005/12/10(土) 07:12:39
ハイハイ -e のあとにスペーススペース
質問はまだかね 暇で暇でしょうがない
質問はまだかね!!
930 :
デフォルトの名無しさん :2005/12/10(土) 16:25:27
あげてみる
すみません、質問させて下さい >perl -MCPAN -e shell で最初に設定する事柄を、後で変更するにはどうすれば良いのでしょうか?
932 :
931 :2005/12/10(土) 17:44:31
自己解決したわ
>931 ではありませんが、 ftp 不可、proxy経由でhttpのみ可能な環境で perl -MCPAN -e shell するにはどうすればよいでしょうか?
934 :
デフォルトの名無しさん :2005/12/10(土) 18:28:43
初歩的な質問ですが検索しても見つからなかったので質問させてください。 ハッシュのキーとして.(ピリオド)と@を含む文字列、 つまるところメールアドレスを取ることはできるのでしょうか。
出来ます
>935 ありがとうございます
それだけかよ! それぐらいすぐテストできるだろ!
Windows版 ActivePerl を使用しています。 *.pl ファイルをダブルクリックして実行するとエラー時にDOS窓が閉じてしまって、 エラーメッセージが読めません。 dos窓を一度開いてからコマンドを入れて実行するとエラーメッセージが読めるのですが、 操作が煩雑になります。 ダブルクリックしたときにエラーメッセージを残すための良いアイディアはないでしょうか?
一番最後の行に `pause`;
ネコミミがついてないやしには難しいな。 eval { &your_main_routine(); } if ($@) { print $@; `pause`; } これでどうだ。
942 :
デフォルトの名無しさん :2005/12/10(土) 20:55:15
今Perlの勉強してるのですが 正確な1秒を刻んでいく関数は何があるのでしょうか どうもsleepは正確ではないようなので
>>942 正確って、どれくらいの正確さを求めてるんだ?
所詮、PCの時計の精度以上は出ないぞ。
>>941 それでもだめだよ
しっかりしろ回答者!
946 :
デフォルトの名無しさん :2005/12/10(土) 21:24:52
>>911 ソースビューワー
my @work = unpack('C*', $val);
$val = '';
foreach my $c (@work) {
if((($c >= 0x30) && ($c <= 0x39)) ||
(($c >= 0x41) && ($c <= 0x5A)) ||
(($c >= 0x61) && ($c <= 0x7A))) {
$val .= chr($c);
} elsif ($c == 0x20) {
$val .= '+';
} else {
$val .= sprintf("%%%02X", $c);
}
}
push(@query, "$key=$val");
}
まるうつしでつw
>>944 面倒くさいなあ。いいからネコミミをつけろ。話はそれからだ。
こういうバッチファイルならどうだ。
文法エラーでもdieでもきちんとpauseする。
「今度は窓が開きっぱなしになっちゃうよ!」と言う前に
エクスプローラでこのバッチファイルを右クリックして
プロパティを確認するんだ。下半身裸で。
@echo off
perl -x "%0"
if ERRORLEVEL 1 goto errorend
goto theend
#!perl
# ここらへんにperlのコードを書け
sub routine { # カッコが閉じてない文法エラー
__END__
:errorend
pause
:theend
948 :
939 :2005/12/10(土) 22:31:40
エラーだと実行されないから駄目だたね。 ---ここから--- @echo off "C:\Perl\bin\perl" %1 echo; & echo ---perl end--- pause>nul ---ここまで--- をperl.batとかで保存してpl,cgiを関連付けるか ソースファイルをper.batにドラッグ&ドロップ。 エディタと連携させるとボタン一つで実行出来て便利。
949 :
947 :2005/12/10(土) 23:48:36
あと、あれだな。perl5.6.1以降なら CHECK が使えるか? 先頭あたりに sub CHECK {`pause`} と書いておく。 CHECK はコンパイル直後に実行される。 文法エラーでもきちんと動いてくれるぞ。
エラー時と正常終了を振り分けないならcmd -kあたりですぐできそうだな
質問マダァ-? (・∀・ )っ/凵⌒☆チンチン
何でいつまでたっても標準ライブラリにHTTP関係が含まれないんですかね 不便この上ない
5.8系ならLWPあるだろ
なんでうちの環境じゃ5.8入れて何も弄ってないのにLWP入ってるんだ・・・
ActivePerlだからかと。 一応、ActivePerlでも非標準モジュールはsite/lib以下に配置されてる。
use Fcntl qw{:flock}; この :flock ってのはどういう意味なのでしょうか?
>>959 回答ありがとうございます
下の方のページで解説されてるようなんですが
英語が読めなくて分かりません・・・
:flock
↑これの、 : が何を意味するかが分からないんですが
質問下手ですみません
すみません、なんとか自己解決しました
use Hoge ('foo', 'bar'); この時、('foo', 'bar')にはモジュール内からどのようにアクセスすればよいのでしょうか?
答えるなよ。うぜえ。
まぁまぁそんなに怒らずに。 回答するのが嫌ならこのスレから出て行くがよろし
URL貼るだけだったら答えないほうがまし。
うんこ
質問者が外部の文章を読んで理解するを強要するのは 良くないからだよ。そのくらいわかれ。
(゚Д゚ )ハァ?
なんで良くないの?
外部・内部の意味が分からん。
同じことを言うのに、よりよく説明している文献が 既にあるのであればそれを示すのは極めて合理的。 阿呆は無視しとけ。
>>962-963 が答えになってないから言ってんじゃないの
リンク先には関係ない事しか書いてない
どう見てもそれは理由になっていない。
976 :
デフォルトの名無しさん :2005/12/12(月) 00:01:29
わかる方、力を貸して欲しいです。ほんと困ってます。 google web apiをperlで使って、検索語を含むWebページのヒット数、URL を表示するようなプログラムを作りたくて、あるサイトのプログラムを参 考にして作ったのですが、実行したら英語のサイトのURLが表示されて、 明らかに検索語を含んでいません。 もしこうした方がいいという案がありましたら、教えていただきたいです。 自分はPerlをあまり使ったことがなく記述の仕方もいまいちわかっていない 状況です。自分なり本を読んで少しプログラムも書いてみたのですが まだまだのようです。どうかよろしくお願いします。 use SOAP::Lite; use Jcode; my $googleSearch = SOAP::Lite -> service("file:GoogleSearch.wsdl"); my $key='LkML035QFHLEaaFEoFDfPd2VZFDzWGCE'; my $query="とんかつ"; my $result = $googleSearch -> doGoogleSearch($key,jcode($query)->utf8, 0, 10, "false", "", "false", "", "UTF-8", "UTF-8"); #print "About ".$result->{"estimatedTotalResultsCount"}."results.\n"; printf("query=%s %d results\n",$query,$result->{estimatedTotalResultsCount}); for $i(@{$result->{resultElements}}){ printf("%s,%s\n",jcode($i->{title})->euc,jcode($i->{URL})->euc); }
>>974 http://www.kt.rim.or.jp/~kbk/perl5.005/perlmod.html#Perl_Modules > Perlのモジュールは
> use Module;
> とするか
> use Module LIST;
> とすることによって、プログラムに取り込まれます。これは、
> BEGIN { require Module; import Module; }
> や
> BEGIN { require Module; import Module LIST; }
> とまったく等価なものです。
http://search.cpan.org/~nwclark/perl-5.8.7/lib/Exporter.pm > DESCRIPTION
>
> The Exporter module implements an import method which allows a module
> to export functions and variables to its users' namespaces. Many modules
> use Exporter rather than implementing their own import method because
> Exporter provides a highly flexible interface, with an implementation
> optimised for the common case.
>>979 上は答えになってないでしょ
下は英語で読めないし
もう少し考えろよ
981 :
980 :2005/12/12(月) 01:11:58
ごめん、無かった事にして
つまるところ URL出されただけじゃ答えを導くのはそう簡単じゃないので 説明付きで回答しろや、と
それには同意
>>965 の言う通り、回答するのが嫌ならこのスレから出ていけばいい。
URL 張るだけじゃなくてキチンと説明しろっていうなら、説明したい奴が
勝手にすればいいんでないの?
よくわからんけど次スレよろ 立てるだけで誰かがテンプレ貼ってくれるなら俺が立てるけど
987 :
デフォルトの名無しさん :2005/12/12(月) 03:03:58
指導者が光臨してるし
988 :
デフォルトの名無しさん :2005/12/12(月) 03:20:55
次スレ立ててくれるひとは、
>>5-7 の間違いの訂正よろしこ
スレ立て行ってくる
991 :
デフォルトの名無しさん :2005/12/12(月) 06:56:36
次スレ移動ですか
松竹梅
松竹梅ってなんだよ
松→竹→梅
松
竹
た
梅
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。