Perlについての質問箱 33箱目
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2007/10/16(火) 00:59:57"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板 http://pc11.2ch.net/php/ )
CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。
http://www.perl.org/get.html
● 2007/10/12現在の最新版: 5.8.8
● 2007/10/12現在の開発版: 5.9.5
前スレ
Perlについての質問箱 32箱目
http://pc11.2ch.net/test/read.cgi/tech/1186995713/
リンク集は>>2-3
過去スレは>>4 あたり
0153デフォルトの名無しさん
2007/10/24(水) 01:29:29print qq{1:$_};
while(<STDIN>){
print qq{2:$_};
last if $_ eq qq{\n};
}
print qq{3:$_\n};
}
をPerl 5.8.8で実行して内側のループを改行のみの入力で抜けた後の3:の値が
1:の時となぜか異なるのですが、$_のスコープみたいなものはどうなっちゃってるんでしょうか?
0154デフォルトの名無しさん
2007/10/24(水) 01:38:25異なって当然ですが
0156153
2007/10/24(水) 01:48:590157デフォルトの名無しさん
2007/10/24(水) 05:47:50その改行を</p>\n<p>に置換したいのですが、
どのようなコードを書くのがもっとも軽い処理になるでしょうか?
0158デフォルトの名無しさん
2007/10/24(水) 06:06:29>>157の</p>\n<p>というのは、
</p>
<p>
というつもりで書きました。
0159デフォルトの名無しさん
2007/10/24(水) 09:21:47> 改行($val =~ \x0D\x0A、\x0D、\x0A)
その表現だと \x0D\x0A を1つの改行と考えるのか
2つの改行 (\x0D と \x0A) と考えるのかで答が変わる。
http://www.din.or.jp/~ohzaki/perl.htm#CRLF_2BR
0160デフォルトの名無しさん
2007/10/24(水) 09:25:280161デフォルトの名無しさん
2007/10/24(水) 09:40:28そのサイトが非常に参考になりました。
$val =~ s/(\x0D\x0A){2,}/<\/p><p>/g;
$val =~ s/(\x0D){2,}/<\/p><p>/g;
$val =~ s/(\x0A){2,}/<\/p><p>/g;
とすることで、連続している改行を
</p><p>
へと置換することまでは完了しました。
しかし、
</p>
<p>
のように改行を含んだ文字列への置換方法がよく分かっていない状況です。
そのあたりについて教えてください。
よろしくお願いします。
(なお、連続した改行でなく、単一の改行の場合は、<br />へと置換する処理を上のコードの下に書いているので、
\nとして改行すると置換されてしまってうまくいきませんでした)
0162デフォルトの名無しさん
2007/10/24(水) 14:13:12Use of uninitialized value in stringというエラーがでるのですが、
$n = 0;やundef $n;を入れて初期化してもエラーが出ます。
なぜですか?
(CSVで同じ行を見るためのスクリプトです)
#!/usr/bin/perl -w
undef $n;
open (MEDIACSV,"media_perl.csv");
@mediacsv = <MEDIACSV>;
@sortedmediacsv = sort(@mediacsv);
while ($sortedmediacsv[$n] ne undef) {
if ($sortedmediacsv[$n] eq $sortedmediacsv[$n+1]) {
print "$sortedmediacsv[$n]";
print "$sortedmediacsv[$n+1]";
};
++$n;
};
close (MEDIACSV);
0163デフォルトの名無しさん
2007/10/24(水) 14:14:12$val =~ s/(\x0D\x0A){2,}/うんこ<\/p>うんこ<p>うんこ/g;
$val =~ s/(\x0D){2,}/うんこ<\/p>うんこ<p>うんこ/g;
$val =~ s/(\x0A){2,}/うんこ<\/p>うんこ<p>うんこ/g;
$val =~ s/\n/<br \/>うんこ/g;
$val =~ s/うんこ/\n/g;
でいいんじゃないの?
0164デフォルトの名無しさん
2007/10/24(水) 14:24:38undef $n; してりゃエラー出るだろ。これは初期化とは言わない。
while ($sortedmediacsv[$n] ne undef) {
これも。undef と比較してどうする。
そもそもキミが何をしたいのか意図が伝わらない。
細かいことを言えば、if {} のうしろの ; もいらない。
基本を理解していない証拠だな。
で、↓これならどうかな。
#!/usr/bin/perl -w
open (MEDIACSV,"media_perl.csv");
@mediacsv = <MEDIACSV>;
@sortedmediacsv = sort(@mediacsv);
for ($n = 0; $n < $#sortedmediacsv; $n++) {
if ($sortedmediacsv[$n] eq $sortedmediacsv[$n+1]) {
print $sortedmediacsv[$n];
print $sortedmediacsv[$n+1];
}
}
0165デフォルトの名無しさん
2007/10/24(水) 14:42:16いや、それはあまりにもひどいだろ。
いや、うんこがひどいんじゃなく、無駄にうんこを付け足そうって言う考え方がさ。
いや、うんこもひどいが。
0166デフォルトの名無しさん
2007/10/24(水) 14:46:41・まず、CRLFを\nに統一する
・段落を抽出する
・段落をpタグで挟む
・改行をbrタグに置換する
・段落末尾に\nをくっつけて結合する
0167デフォルトの名無しさん
2007/10/24(水) 14:50:41$val =~ s/\x0d\x0a|\x0d|\x0a/\n/g;
@lines = split /\n\n+/, $val;
@lines = map { '<p>' . $_ . '</p>' } @lines;
@lines = map { s/\n/<br \/>/g } @lines;
$result = join '', map { $_ . "\n" } @lines;
多分、これ一文で書けるよ
0168デフォルトの名無しさん
2007/10/24(水) 15:13:15助かりました。ありがとうございます。
0169デフォルトの名無しさん
2007/10/24(水) 16:25:50これってどう解釈すればいいんでしょうか・・・
$yが真だったら$yが代入される
$yが非だったら$xが代入される(値は変わらない)
ってことで大丈夫ですか?
0170デフォルトの名無しさん
2007/10/24(水) 16:29:36どなたか参考になるサイトもしくは手順等をお教えいただけないでしょうか。
宜しくお願いします。
0171デフォルトの名無しさん
2007/10/24(水) 16:45:24http://www.site-cooler.com/kwl/perl/6.htm#6-7
http://www.site-cooler.com/kwl/perl/5.htm#5-5
>>2-4
0172デフォルトの名無しさん
2007/10/24(水) 16:47:18$xが偽だったら$xに$yが代入される
$xが真だったらなにも行われない。
0173デフォルトの名無しさん
2007/10/24(水) 16:50:23http://search.cpan.org/~lbrocard/perl5.005_04/
0174デフォルトの名無しさん
2007/10/24(水) 18:27:100175デフォルトの名無しさん
2007/10/24(水) 18:33:250176デフォルトの名無しさん
2007/10/24(水) 19:24:18知ってるか、PHPって最初はperlで動いてたんだぜ
0177デフォルトの名無しさん
2007/10/24(水) 19:38:350178デフォルトの名無しさん
2007/10/24(水) 20:31:44そういう発想がありませんでした。
ありがとうございます。
無事に目的を果たすことができました。
0179デフォルトの名無しさん
2007/10/24(水) 21:44:160180デフォルトの名無しさん
2007/10/25(木) 14:47:52プログラム内で
$data = '1234567890...';
とやるのと、普通にファイルから読み込むのとではどちらが効率が良いでしょうか?
前者の場合はデータの分だけコードが長くなるからメモリの効率悪くなったりするんでしょうか?
0181デフォルトの名無しさん
2007/10/25(木) 14:58:50埋め込み
0182デフォルトの名無しさん
2007/10/25(木) 15:11:29プログラム内にデータを埋め込む方が効率が良いということですか。
ありがとうございます。
0183デフォルトの名無しさん
2007/10/25(木) 16:34:450184デフォルトの名無しさん
2007/10/25(木) 16:54:01プログラムの中に埋め込んでおけば
効率的に照合処理できるに決まってる。
0185デフォルトの名無しさん
2007/10/25(木) 21:24:26別のスクリプトでも利用する値なら置くべき場所に置いとく
0186デフォルトの名無しさん
2007/10/25(木) 21:41:130187デフォルトの名無しさん
2007/10/25(木) 21:51:290188デフォルトの名無しさん
2007/10/25(木) 22:25:09どーんとプログラム作りました→動かしました
じゃなくて、perlでプログラム作りながら、データ見て、
またプログラムの手直し、データの改修を逐次的に処理していかないと。
戻り作業の繰り返しで話が前に進まないんだがな。
舛添の会見見ててこいつなんもわかっちゃねーなと思うのって俺だけか?
0189デフォルトの名無しさん
2007/10/25(木) 22:40:34つーかさ、まずは己を知ることだと思うんだよ。
データを代名詞的に多用してるその文章見ただけでも、おまえ人並み以下だよ。
0190デフォルトの名無しさん
2007/10/25(木) 22:47:130191デフォルトの名無しさん
2007/10/25(木) 22:57:37どこにでもいるお馬鹿な客の一人。今さら言うまでもない。
0193デフォルトの名無しさん
2007/10/25(木) 23:40:45>客をその気にさせる
頭が悪いやつだな。
社会保険庁のトラブルは、客にいやなこと(「業務フロー上、将来禍根を残しますよ」)を
はっきり言わなかったのが原因だろ。現にトラブルがプログラマのせいにされている。
「その気にさせる」じゃまずい場合の典型事例だろうが。
社保庁システムのプログラマ(どうせコボラ)には、あまり親近感はないがね。
0194デフォルトの名無しさん
2007/10/25(木) 23:55:54Perlと全くかんけーねーし
0195デフォルトの名無しさん
2007/10/26(金) 00:20:040196デフォルトの名無しさん
2007/10/26(金) 00:56:24それだと毎年800億円もの受注が受けられない。
だからわざわざ回りくどい方法でシステムつくって
人月稼ぎしているんだよ。
0197デフォルトの名無しさん
2007/10/26(金) 01:16:50そ
だ
人
0198デフォルトの名無しさん
2007/10/28(日) 15:59:03【配布元URL.】 http://www.supra.cx/joyful2chMe/index.html
【設置サーバ】 ロリポップ
変数を追加したくて※Aを追加したのですが、文字化けしてしまいます。
どういった原因がかんがえられるのでしょうか?
# ライブラリ取込
require './jcodeg.pl';
require './cgi-lib.pl';
require './bbs-lib.pl';
require './config.cgi';
←ここにrequire .'./.'./○○.cgi';を追加したいのですが。(※A.)
※Aを追加せずに、改行を1つだけ加えてアップしても、文字化けします。
ちなみに、PC用の方は問題ないのですが、ケータイ用だけが文字化けします。
配布者の掲示板も機能してないみたいなので、
原因分かる方居られましたら、ヨロシクお願いします。
0199デフォルトの名無しさん
2007/10/28(日) 16:10:33※Aは「require '../../○○.cgi';」の間違いです
0200デフォルトの名無しさん
2007/10/28(日) 16:11:580201デフォルトの名無しさん
2007/10/28(日) 16:16:240202デフォルトの名無しさん
2007/10/28(日) 16:22:35push(@result, $_) if &$coderef;
の&$coderefはどういう意味なんでしょうか?
配列の各要素に対して、真か偽を返す関数だと思うんですが、
引数が渡されずに関数が呼び出されているように見えるんですが・・・
0203デフォルトの名無しさん
2007/10/28(日) 16:26:42おつ〜
埋めていくか
0204デフォルトの名無しさん
2007/10/28(日) 16:33:490205デフォルトの名無しさん
2007/10/28(日) 17:56:53本物の grep でも $_ にリストの各要素が入ってくるじゃないか。
例えば my @result = mygrep { /foo/ } 'foo', 'bar', 'foobar'; なら
sub mygrep (&@) {
my $coderef = shift; # sub { /foo/ }
my @result;
foreach $_ (@_) { # ('foo', 'bar', 'foobar')
push(@result, $_) if &$coderef; # if $_ =~ /foo/
}
@result; # ('foo', 'foobar')
}
0206202
2007/10/28(日) 18:57:49if &$coderef;
が、どうして
# if $_ =~ /foo/
と解釈されるのかがよくわからないですorz
括弧をつけずに関数を呼び出すと@_が引数としてわたされるとしても
その内容にアクセスするには$_[0]と書かないといけないですよね。
でも実際には$_とfooがチェックされてるわけで、この$_の値が
どっからきたのかがわからないんです。
0207デフォルトの名無しさん
2007/10/28(日) 19:24:26自分が分かるように書けばよろし。
誰か別人が書いたコードを無理やりメンテさせられるのなら仕方ないが。
そんときは、自分でわかるように書き換えるな。俺なら。
0208デフォルトの名無しさん
2007/10/28(日) 20:06:50> foreach $_ (@_) {
この $_ は foreach ブロック内に局所化 (local) されてはいるけど
グローバル変数なんだからそのまま &$coderef 内でも参照できる。
$_ = 'quux';
my $coderef = sub { print ucfirst };
$coderef->() for qw(foo bar baz); # FooBarBaz
$coderef->(); # Quux
0209デフォルトの名無しさん
2007/10/30(火) 03:47:57use threadsを使って複数のスレッドを起動させているのですが、
そのスレッド毎にタイムアウト処理を作りたいのですが、うまくいきません。
0210デフォルトの名無しさん
2007/10/30(火) 04:39:40作りなおして全部POEにぶちこんだ方が良い悪寒
0211至急
2007/10/31(水) 18:53:18CGIに詳しく都内に来れる方であれば可能
詳しい人からすればそこまで難しくないと思われます。
一日日払い即金である程度払います。。
詳細はメール下さい。
0212デフォルトの名無しさん
2007/10/31(水) 19:24:42>>1
> CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
> (WEBプログラミング板 http://pc11.2ch.net/php/ )
0213デフォルトの名無しさん
2007/10/31(水) 19:35:230214デフォルトの名無しさん
2007/11/01(木) 02:14:40情報ありがとうございます
POEを使う方向で考えてみます
0215デフォルトの名無しさん
2007/11/01(木) 07:32:34POE を作り直してくれないか。
0216デフォルトの名無しさん
2007/11/01(木) 15:39:13sub foo{
my @l, %h;
print '"'.$h{'ex'}.'"=>';
$h{'ex'} = &bar(1,2,\%h);
print '"'.$h{'ex'}.'"=>';
$h{'ex'} .= &bar(1,2,\%article_replacements);
print '"'.$h{'ex'}.'"';
}
sub bar{
my $a = $_[0], $b = $_[1], %h = %{$_[2]};
return 'A';
}
というプログラムについてなのですが、fooの1行目が
my %h, @l;だと""=>"A"=>"AA"と表示され、
my @l, %h;だと""=>"A"=>""と表示されます。
変数の順番を入れ替えただけで結果が変わってしまうのは
なぜなのでしょうか?
Perlのバージョンはv5.8.8 built for MSWin32-x86-multi-threadです。
0217216
2007/11/01(木) 15:42:38$h{'ex'} = &bar(1,2,\%h2);です。すいません。
0218216
2007/11/01(木) 15:43:42本当にすみません…。
0219デフォルトの名無しさん
2007/11/01(木) 15:54:17> 変数の順番を入れ替えただけで結果が変わってしまうのは
> なぜなのでしょうか?
変数の順番を入れ替えただけだと決めつけてる時点で、君はすでに敗北しているのだ。
0220デフォルトの名無しさん
2007/11/01(木) 15:54:32my $foo, $bar; は my($foo), $bar; であって my($foo, $bar); ではない。
0221デフォルトの名無しさん
2007/11/01(木) 15:56:390222デフォルトの名無しさん
2007/11/01(木) 15:59:05use warnings;
をつけろ
話はそれからだ
0223デフォルトの名無しさん
2007/11/01(木) 17:04:45>my $a = $_[0], $b = $_[1], %h = %{$_[2]};
my ( $a = $_[0], $b = $_[1], %h = %{$_[2]} ) ;
と判断しても、
( my $a = $_[0], my $b = $_[1], my %h = %{$_[2]};
と判断しても、、、
この前もどっかのスレで見たが、こんなトンチンカンな書き方を何処で
覚えてくるんだろう?後者は strict, warnings が通ってしまうから
なおさら、、、
0224デフォルトの名無しさん
2007/11/01(木) 17:23:010225216
2007/11/01(木) 18:47:04C言語でいうint a, b;と同じ扱いだと思っていました。
お恥ずかしい限りです。ありがとうございました。
0226デフォルトの名無しさん
2007/11/01(木) 22:11:56他の言語から来た奴だと結構ありがちかと。
0227デフォルトの名無しさん
2007/11/01(木) 22:21:15このページの先物取引情報っていう表の部分だけ取り出して、
エクセルに保存するスクリプトを書いているんですが、
「ページを解析して表だけHTMLごと取り出す処理」がなかなか上手くいきません。
TreeBuilder使ったのですが、
�@このページのHTMLタグ内にはclassもidもないので、
特定のtableタグをとってくる事ができない。
�A加えて、TreeBuilderを使うとHTMLタグが取り払われてしまう(?)
っていう問題で苦戦してます。
どなたかこの部分のやり方を教えていただけると助かります。
0228デフォルトの名無しさん
2007/11/02(金) 00:10:19無理に型に嵌めた作り方しなくても、
「TOPIX NET 」という文字が出てきたらフラグ立てて、
次の<tr>から</table>までを抜き出せばいいだけじゃないの?
0229デフォルトの名無しさん
2007/11/02(金) 00:14:34あれこれ考えるより、とりあえず手を動かしてうまくいったら結果オーライってことで。
どうせスクレイピングなんてページの仕様が変わったらそれまでなんだし。
my $page = ここに目的のページコンテントを入れる
my $tree = HTML::TreeBuilder->new_from_content($page);
# とりあえず会社名に一番近いタグを目印に
my @companies = $tree->look_down(_tag=> "td", bgcolor => '#CCCCCC');
my $i = 1;
my @table;
for my $co (@companies) {
#奇数番目に関係ない要素がはいりこんだのでオミット
$i++ % 2 and next;
my $co = $co->look_up(_tag=>"tr");
my $co_text = $co->look_down(_tag=>"font")->as_text;
my @data = map { $_->as_text } $co->look_down(_tag => "div");
push @table, [ $co_text, @data ];
}
$tree->delete;
0230デフォルトの名無しさん
2007/11/02(金) 03:38:100231デフォルトの名無しさん
2007/11/02(金) 09:47:060232デフォルトの名無しさん
2007/11/02(金) 10:40:370233デフォルトの名無しさん
2007/11/02(金) 12:20:18Perlっぽくない気がする。
C臭さがプンプンしていて、どうも違和感が。
0234デフォルトの名無しさん
2007/11/02(金) 22:12:17文句言うだけなら子供でも言える。
0235デフォルトの名無しさん
2007/11/02(金) 22:14:55KENTの自作自演か?
言ってることがでたらめすぎるぞ。
0236デフォルトの名無しさん
2007/11/02(金) 22:28:12おや、見せられないのかい?恥ずかしくて他人には見せられないの?
へぇ。そう。
だったら他人のコードを批判する資格はまったく無いね。
0237デフォルトの名無しさん
2007/11/02(金) 22:49:56Perlらしいとかそんな次元の話じゃないだろ
0238デフォルトの名無しさん
2007/11/02(金) 23:03:28早く「Perlらしいコード」とやらを見せてくれよ。
0239デフォルトの名無しさん
2007/11/02(金) 23:07:38/ニYニヽ
(ヽ /( ゚ )( ゚ )ヽ /)
(((i ) /::::⌒`´⌒::::\ ( i))) でっていうwwwwwwwww
/∠_| ,-)___(-, |_ゝ \
( ___、 |-┬-| ,__ )
| `ー'´ /´
| /
0240デフォルトの名無しさん
2007/11/02(金) 23:15:27哀れなほど孤軍奮闘だなw
0241デフォルトの名無しさん
2007/11/02(金) 23:36:41&jcode'convert(*line, 'sjis') でなく &jcode::convert(\$line, 'sjis') な記述になってるし
flock(FH, 2) してるし、もうびっくりですよ。
0242デフォルトの名無しさん
2007/11/02(金) 23:46:09カートゥーンのキャラクターがぼやいてるようなやつ
0243デフォルトの名無しさん
2007/11/03(土) 00:14:120244デフォルトの名無しさん
2007/11/03(土) 00:24:240245デフォルトの名無しさん
2007/11/03(土) 00:51:44へ〜〜〜知らなかった〜〜〜!
そうなの、初めて知ったよ。
よく知ってるね、キミって情報ツウ?。すごいよ物知り博士だよ。
ネ申!ホトケ!天神まさ!ダイバダッタ!尊氏さまだよ!
0246デフォルトの名無しさん
2007/11/03(土) 01:09:400247デフォルトの名無しさん
2007/11/03(土) 01:22:250248デフォルトの名無しさん
2007/11/03(土) 01:27:35誰かと対談してて顔写真が載ってた
0249デフォルトの名無しさん
2007/11/03(土) 01:43:01へ〜〜〜すご〜い!
何でも知ってるんだね、物知りだね。
日系ソフトウエア読んでるだけでも自慢できるよ。
こんなクソスレにネ申が現れようとは!
0250デフォルトの名無しさん
2007/11/03(土) 03:12:450251デフォルトの名無しさん
2007/11/03(土) 08:22:350252デフォルトの名無しさん
2007/11/03(土) 12:19:16あたまいいねー。
■ このスレッドは過去ログ倉庫に格納されています