トップページphp
1001コメント332KB

Perlコーディング初心者質問スレ Part 61

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2010/06/05(土) 21:11:10ID:???
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

お勧めサイトは >2 以降

前スレ http://pc11.2ch.net/test/read.cgi/php/1251989472/
0754Perl忍者 ◆M5ZWRnXOj6 2010/11/26(金) 21:49:28ID:pwS23Ki1
値の検証などできるよクレジット
あと外部プログラムにつないだりできるよ
0755Perl忍者 ◆M5ZWRnXOj6 2010/11/26(金) 21:52:42ID:pwS23Ki1
なんでもできるよ^o^

オブジェクトの理解でつまってるってほんと終わってるねw
0756nobodyさん2010/11/26(金) 22:57:56ID:???
my $ua = new LWP::UserAgent;

my $ua = LWP::UserAgent->new;
のシンタックスシュガー、だっけ?
0757nobodyさん2010/11/26(金) 23:30:39ID:???
シンタックスシュガーって何?っていう質問が来ると思うよ。
0758nobodyさん2010/11/26(金) 23:47:19ID:???
$fh->print
print $fh
0759nobodyさん2010/11/27(土) 00:29:26ID:???
>>747
SSLだからセキュリティは完璧クンか。
0760nobodyさん2010/11/27(土) 03:55:49ID:???
とあるシュガーの統語法〈シンタックス〉
0761nobodyさん2010/11/27(土) 04:38:13ID:???
むしろ

「とあるPerlの糖衣構文(シンタックスシュガー)」

思ったよりつまらんな
0762nobodyさん2010/11/27(土) 11:15:26ID:???
>>759
誰を刺してるんだ?
0763なるとくん2010/11/27(土) 19:43:14ID:40qrjSo/
宮川達彦=うちはイタチ
0764nobodyさん2010/11/27(土) 22:11:23ID:???
>>761
これ?
ttp://item.rakuten.co.jp/koyoproduck/01221/
0765nobodyさん2010/11/28(日) 00:44:24ID:???
たぶんそれだ!
0766nobodyさん2010/11/28(日) 01:05:51ID:???
>>762

> >>746
> またお前か ←
0767nobodyさん2010/11/29(月) 05:53:06ID:???
Perlの文中の配列をjavascriptの中でそのまま使いたいのですが上手くいきません

@list = (a,b,c,……);
$length = @list;

<script language="javascript">
for(i = 0; i<$length; i++){

#このfor文の中で
# $list[i] を使うとエラーになり、
# "$list[i]"だと参照できますがインデックスのiがインクリメントせず最初の要素aが繰り返し参照されます。インクリメントしてほしいです

}

どうしたらいいでしょうか?
0768nobodyさん2010/11/29(月) 06:20:49ID:???
perl の中で JavaScript を print してる部分を晒してもらわな・・・
0769nobodyさん2010/11/29(月) 06:32:34ID:???
perlで書いたCGIスクリプト中のJavaScriptで、
perl側の配列を使いたい、ということ?
でもperlで作った配列はJavaScriptからは当然見えっこないんだから
JavaScript側にもperlの@listと同じデータ列の配列を定義しておいてやらねばいけないんでは

### perlコード
my @list = (1, 2, 3);
# @list = (a, b, c) は変じゃないか? ("a", "b", "c") ならわかるけど…
my $js_array = join ', ', @list;
# @listの内容が文字・文字列の場合はこうかなちょっと冗長だけど
# my $js_array = join ', ', map "'" . $_ . "'", @list;

### JavaScriptコード
print <<EOT;
<script type="text/javascript">
list = new Array($js_array);
for (i = 0; i < list.length; i++) {
document.write(list[i]);
}
</script>
EOT

それとも JavaScript のループ内で、JavaScriptの配列の添字 (i) を使って
Perl の側の配列 (@list) の要素を取り出したいということ?
しかしその場合そもそもJavaScriptのコード側がforループになっている必要あるの?
Perl側の段階でforeach等でループ処理するべきなんでは
07707672010/11/29(月) 07:16:51ID:???
>>768
中身も書くべきでしたね
すみません


>>769
joinでまとめて変数に入れれば良かったのですね
配列として使いたかったので助かりました
ありがとうございます
07716762010/11/29(月) 13:13:48ID:???
スレ違いかもしれませんが、ついでなので脳内MVCを画像にしてみました。
BはCに戻る方が正しいかもしれませんが・・・

http://ichigo-up.com/cgi/up/qqq/nm28196.png
0772nobodyさん2010/11/30(火) 00:10:19ID:???
同一ページへのPOSTでフォームデータを受け取りたいのですが
以下の方法でreadしても、何も入っていません。

if ($ENV{REQUEST_METHOD} eq 'POST') {
read(STDIN, $read_data, $ENV{'CONTENT_LENGTH'});
}

別ページへPOSTした場合は、受け取ることができたのですが…
CGI.pmが使えない環境で、別に何か方法はありますか?

0773nobodyさん2010/11/30(火) 00:20:25ID:???
別の方法を探すより、現在のコードのバグを探す方が先決と思う。
0774nobodyさん2010/11/30(火) 01:23:19ID:???
どう考えてもバグかmod_perl動いてるか
何故か強力なキャッシュが働いてるか・・・
なんとも言えん
0775nobodyさん2010/11/30(火) 08:50:01ID:???
>>772
とりあえず使ってる変数の内容が想定通りか1個ずつ確認するところから
07767722010/12/01(水) 01:26:55ID:???
my $read_data = <>;
...
read(STDIN, $read_data, $ENV{'CONTENT_LENGTH'});
と書いてたのがreadが空だった原因みたいです。

my $read_data;に修正したらreadできるようになりました。
または、readを削って、my $read_data = <>;だけでも読めました。
ダイアモンド演算子を訳もわからず使ってました。
0777nobodyさん2010/12/01(水) 01:29:41ID:???
原因が(自力で)解明できてよかったね
>>775 のアドバイスが効いたのかな (775は俺じゃないけど)
0778nobodyさん2010/12/01(水) 02:23:15ID:???
http://www.atmarkit.co.jp/flinux/rensai/mysql04/mysql04b.html
ここを参考にやってんだけど、データベースに接続できないorz@MySQL 5.1.41


DBD は CPAN じゃなくて ppm で拾ってきたものを使用
0779nobodyさん2010/12/01(水) 02:31:06ID:???
MySQL 上ではこんな感じ。

show grant for tester@localhost;
GRANT ALL PRIVILEGES ON *.* TO 'tester'@'localhost' IDENTIFIED BY PASSWORD '*****'
GRANT ALL PRIVILEGES ON `testdb`.* TO 'tester'@'localhost'


perl から connect('DBI:mysql:testdb:localhost' , $username, $password); ってすると、
Can't connect to MySQL server on 'localhost' (10061)
ってなる。

むぅ。。。
0780nobodyさん2010/12/01(水) 13:54:32ID:???
>>779
MySQL が起動してない or Port3306がファイアーウォールで遮断されてる
0781nobodyさん2010/12/01(水) 18:53:40ID:???
>>780
0782nobodyさん2010/12/01(水) 23:41:40ID:???
Perlの負荷がすごいから一部だけでもPHP化できないかと思ってIf構文だけ挑戦してみたんだけど

print <<EOF;
<?PHP
print "Content-type: text/html\n";
$G='0';
if($G==1){$G3=1;}
else if($G==2){$G3=2}
?>
EOF

こうしてみたらContent-type: text/htmlだけがテキスト出力されるのだけどどうしたらいいのかな?
0783nobodyさん2010/12/01(水) 23:59:03ID:???
>>782
これはPerlとPHPのコードが混じってるの?
どういう動きを期待してるのか分からない。

もしPerlスクリプトの一部分を新規のPHPプロセスで呼び出そうとしてるとか
Perlの出力結果をPHPソースコードとして見て改めてPHPで実行する(またはその逆)とか
そういう事なら余計重くなるだろうね。

PHPスクリプトを動的に作ってドキュメントルート以下にphpファイルとして書き出すなら分からなくもないけど。
0784nobodyさん2010/12/02(木) 00:38:59ID:???
そもそもPerlでCGIスクリプトを書いてるんなら、
Content-type: text/html\n\n
を出力するのはperl(CGIスクリプト)側の仕事だろう。
で、PHPコード中でいじってる$Gや$G3はどこで使ってるの?
Perlスクリプトで参照してるんだったら全く意味がない。
あとPHPでelse ifを書く時はの表記は「elseif」。
0785nobodyさん2010/12/02(木) 00:56:20ID:???
PerlさんにPHPのソースコードを print させるのが「PHP化」でいいんだろうか。
0786nobodyさん2010/12/02(木) 01:01:43ID:???
PHPでは/else ?if/はどっちでもいいんじゃなかったけ
まあなんにしても何がやりたいのかまったくわからんわけだが
0787nobodyさん2010/12/02(木) 03:03:55ID:???
「Perlが遅い」ってことは、PerlはCGIでPHPはモジュールだってことだよな
CGIが走ってる最中にPHP文書いたからってモジュールモードで動くのか?

・・・仮にそうだとしてもifひとつで差が出るとは思えんが
というか逆に遅くなりそうだが
0788nobodyさん2010/12/02(木) 04:23:37ID:???
そうだよなあCGI(Perl)とPHPが同時に、または続けて処理されることはたぶんない
となるとContent-type: text/htmlが表示されたっていうのはどういうことなんだ?
0789nobodyさん2010/12/02(木) 06:58:59ID:???
mod_perlでもspeedycgiを使えば解決
0790nobodyさん2010/12/02(木) 11:22:29ID:???
require './item.txt';

$w = 0;
$h = 0;
$t = 0;
@we = ();
@he = ();
@tr = ();

for($i = 0;$i <= 6;$i++){
if(${'item'.$i}[1] = 0){
$we[$w] = "@{'item'.$i}";
$w++;
}
elsif(${'item'.$i}[1] = 1){
$he[$h] = "@{'item'.$i}";
$h++;
}
else{
$tr[$t] = "@{'item'.$i}";
$t++;
}
}

item.txtには各行に @item(数字) = ("文字列",0〜2の数字,0〜2の数字); の配列が入っています
2つ目の数字の要素で各配列を3つの配列@we,@he,@trに振り分けたいのですが、要素の数字によらず全て@heに入ってしまいます
文字列の要素のせいでif文のイコールがブール値を求めているのか、(${'item'.$i}[1] = 1)の右辺が0以外の時に条件を満たすようです
そして何故か右辺のオペランドが${'item'.$i}[1]に代入されています
( (${'item'.$i}[1] = "A")なら@heの各要素が("文字列","A",数字)になります)
どうしたらいいでしょうか?
0791nobodyさん2010/12/02(木) 12:54:26ID:???
>>790
お前は=と==の違いをもう一度よく復習すべきだと思われ
0792nobodyさん2010/12/02(木) 14:15:19ID:???
==はcにしても初歩の間違いだよな。
0793nobodyさん2010/12/02(木) 15:20:54ID:???
=が許されるのはシェルスクリプトまでだよねー
0794nobodyさん2010/12/02(木) 15:33:12ID:???
いやシェルスクリプトでも == だろ
07957902010/12/02(木) 16:56:40ID:???
if文では==を使うのですね;
失礼しました
0796nobodyさん2010/12/02(木) 17:02:54ID:???
>>795
>>791
0797nobodyさん2010/12/02(木) 17:09:49ID:???
昔、BASICは=だった。
今は知らん。
0798nobodyさん2010/12/02(木) 17:10:45ID:???
>>795
ま、よくある初心者の間違いさ。
0799nobodyさん2010/12/02(木) 17:44:16ID:???
BASICの比較演算子は、==でなくて=、!=でなくて<>だったっけな。
0800nobodyさん2010/12/03(金) 00:17:39ID:???
たしかそんな感じ

if $cnt <> 0 then
else
endif

だったような


個人的には 「then」 ってなんか好きw
0801nobodyさん2010/12/03(金) 01:10:22ID:???
俺の知ってる時代のBASICはif文を複数行にわたって書けなかった。
IF A <> 0 THEN GOSUB 1000 ELSE GOSUB 2000
とかそんな感じだったような。ENDIFはなかった。
完全にスレ違いだな。すまん。
0802nobodyさん2010/12/03(金) 07:07:22ID:???
そうだ、思い出した。
endifなんて無かった。
0803nobodyさん2010/12/03(金) 10:37:46ID:???
@dataの5番目から9番目までをループさせるときに
for文の中で、ループ内容を1項目だけ追加させたい場合はどうしますか?

$start=5;
$end=9;

for ($start..$end) {

##$data[$_]にabcが含まれてたらループを1つ追加
if ($data[$_] =~ /abc/i) {
$end++;
}

##$data[$_]を書き出し
print $data[$_];

}

ってやってもダメでした。
0804nobodyさん2010/12/03(金) 10:56:43ID:???
until ($now > $end)
0805nobodyさん2010/12/03(金) 11:07:30ID:???
なるほど、 for文でなく、until文ですねトライしてみます
0806nobodyさん2010/12/03(金) 11:33:54ID:???
質問させてください。
掲示板(CGIのページ)にモバイルアドセンスを表示したいんですけどうまく表示できません・・・
どこをいじったら良いのでしょうか?

下の掲示板を利用してます。PCには表示できますがモバイルにはどうしても
無理です。
http://www.kent-web.com/bbs/epad.html


ptel.plにモバイルアドセンス(CGIコード)を書きましたがエラーになります。
携帯からアクセスしたさい、一番上にアドセンスが表示されてれば
問題ないです。

宜しくお願いします。
0807nobodyさん2010/12/03(金) 11:50:43ID:???
>>806
【 スクリプト改造依頼スレ】(丸投げ) part7再々
http://hibari.2ch.net/test/read.cgi/php/1222645553/
★三 【 スクリプト改造工房 PART 9 】 ★三
http://hibari.2ch.net/test/read.cgi/php/1143834740/
0808nobodyさん2010/12/03(金) 15:45:42ID:???
kent スクリプトに strict を求めるのが酷だw
0809gfx2010/12/03(金) 20:37:49ID:???
よろしくwww
0810gfx2010/12/03(金) 20:41:32ID:???
私のハテダですよろしくw

http://d.hatena.ne.jp/gfx/


Perl忍者君に誘われて2chデビューしましたw
0811nobodyさん2010/12/03(金) 21:04:26ID:???
激しく騙り臭がするな。
本人ならハテダに2chデビューしましたって書いてみてくれよ。
0812nobodyさん2010/12/03(金) 21:04:42ID:???
ああ、かわいそうに
IRCでキチガイに触れてしまったばかりに…
0813nobodyさん2010/12/05(日) 00:07:53ID:???
どうやらにせものだったようだ
0814nobodyさん2010/12/05(日) 17:11:31ID:???
今どきkentはねえよ。
さっさと捨てろ
0815nobodyさん2010/12/08(水) 17:33:34ID:???
今、 utf-8 の文字コードでスクリプトを書いてて、utf-8 のファイルを読み込んで、HTML の META で utf-8 を指定して表示してます。
use utf8; はしてません。

これ自体はちゃんと表示できてるのですが、ファイルを読み込むときに明示的に utf-8 だと指定した方がいいかな?と思い、
ファイルを読み込むときに <:utf8 とすると、読み込んだデータはちゃんと表示されますが、
スクリプトの中に直接書いて表示してる全角文字がすべて文字化けしてます。


'<:utf8' ではなく '<' で読み込めば、文字化けせずすべてちゃんと表示されます。

use utf8; してみましたが状況が変わりません。
binmode STDOUT, ":utf8"; としても駄目でした。


ファイルを読み込むときに <:utf8 を指定しつつ、スクリプトに書いた全角文字が文字化けしない方法ってどうやるんでしょう?
0816nobodyさん2010/12/08(水) 17:51:37ID:???
あっ、なんとなく分かった気がする

一箇所でも <:utf8 とか binmode STDOUT, ":utf8" ってやるとスクリプト全体 (use とか require するもの) に影響する。 って感じかな?
0817nobodyさん2010/12/08(水) 17:59:53ID:???
use utf8; してフラグを付ける必要性がわからない
0818nobodyさん2010/12/08(水) 20:12:49ID:???
utf8フラグをつけて読み込むと、ファイル中の生のutf8コードからperl内部コードのutf8に変換される。
一方use utf8;しないで書いてるからスクリプト中のutf8文字コードは生のutf8コードのまま。
その両者を混ぜてしまうから化ける。
ってことじゃないだろうか。
0819nobodyさん2010/12/08(水) 20:33:41ID:???
ってことでしょうね。

perlio
> :utf8
> Declares that the stream accepts perl's *internal* encoding of characters.
0820nobodyさん2010/12/08(水) 20:49:34ID:???
例えば漢字の「愛」は、
生のUTF-8nコードでは 0xe6、0x84、0x9bの3バイトだが、
Perlの内部コードでは0x611b。
前者を split // すると (0xe6, 0x84, 0x9b) ができる。単なる3バイトのデータ列としての扱い。
後者を split // すると (0x611b) ができる。内部コード0x611bの「愛」という(splitできない)1文字としての扱い。
0821nobodyさん2010/12/08(水) 21:53:27ID:???
ありがとう
文字化けする理由が >>820 でなんとなく分かった。


が、フラグを立てる理由というか使い道が分からない。
フラグを立ててれば半角全角関係なく文字数が簡単に分かる (ですよね?) とか、そうゆう利点だけな気がしてならないもんで・・・
0822nobodyさん2010/12/08(水) 22:05:28ID:???
>>821
文字数が簡単にわかるだけでなく、各文字の区切り(境界)を意識しないで文字列処理ができる。
ShiftJISコードでの文字処理・文字列処理は面倒だったなあ…(遠い目)

その代わり場合によっては文字コード変換時に一部記号などが化けることがあったりとか
別の厄介事も若干発生しているけど、まあそのへんは仕方ないかね。
0823nobodyさん2010/12/08(水) 23:05:01ID:???
>>821
フラグを立てるというか実質的に変換処理が走ってると思った方が分かりやすいはず
メリットで大きいと思うのは文字列として正しくない並びのバイト列を弾けること
0824nobodyさん2010/12/09(木) 09:19:59ID:???
>>821?正規表現で余計な事考えなくていい、とか
0825nobodyさん2010/12/09(木) 18:22:44ID:???
文字列$html に含まれるメールアドレスの全てをリストに格納したいのですがどうすればいいのですか?

while ($html =~ /([-.\w]+@[-.\w])/g)
{ push(@list, $1); }

とやると固まりました。無限ループかもしれません。
どうやったらやりたいことができるでしょうか?
0826nobodyさん2010/12/09(木) 18:27:51ID:???
業者にメアドのリストを売るつもりなんかな?
0827nobodyさん2010/12/09(木) 18:31:53ID:???
事故解決。本当は別だけど特定されたくないのでメルアドを例にしたのです。
0828nobodyさん2010/12/09(木) 18:45:33ID:???
while ($html =~ s/([-.\w]+@[-.\w])//){
push(@list, $1);
}

$html を後々使うなら

my $html_bak = $html;
みたいにバックアップを。
0829nobodyさん2010/12/09(木) 18:47:25ID:???
ちなみに最初に質問者が出したコードは無限ループしてる

同じ内容をひたすらマッチし続けてる
0830nobodyさん2010/12/09(木) 19:20:57ID:???
my @foo = $baa =~ /([-.\w]+@[-.\w])/g;
でできなかったっけ
0831nobodyさん2010/12/09(木) 19:25:05ID:???
m//g はスカラーコンテキストだとイテレータ的に動作するから無限ループにゃならんと思うんだが
0832nobodyさん2010/12/09(木) 19:42:18ID:???
どーせ隠したい()スクリプトがkusoだったんだろう
08338262010/12/09(木) 20:03:56ID:???
ちなみにこれを使った。
@list=($html =~ /([-.\w]+@[-.\w])/g);

>>828
$htmlが$mech->content()だったらどうってことないですよね?

>>829
してたと思います。確実にwhileで止まっていました。

>>831
しかし∞ループしてました。
@list=($html =~ /([-.\w]+@[-.\w])/g);
に入れ替えたとたんうまくいったので。


@list=($html =~ /mailto:([-.\w]+@[-.\w])/g);
としてもメルアドだけのリストができたんだけどどうしてですか?
0834nobodyさん2010/12/09(木) 20:06:16ID:???
↑825だった。
0835nobodyさん2010/12/09(木) 20:13:01ID:???
>>830
それは真偽値がかえると勘違いしていました。
カッコが必要だと思っていました。正しいのですね。

$baa='abc@abc xyz@xyz 1a2b3c@4d5e';
my @foo = $baa =~ /([-.\w]+@[-.\w]+)/g;
print "@foo\n";

abc@abc xyz@xyz 1a2b3c@4d5e
0836nobodyさん2010/12/09(木) 20:40:31ID:???
特定されたくなくてだかなんだか知らないが
実際に動かないコードではない別のコードを捏造して質問するとは駄目な質問者だ。
>>828は無限ループなどにならずにちゃんと機能したぞ。試してみたら。
ただタイプミスのせいで「メールアドレス」は取得し損なってるけど。
たぶん、元の動かないコードに別のバグがあったんだろう。
結局、真の原因はわからずじまいか。
0837nobodyさん2010/12/09(木) 20:51:36ID:???
foreach を使った場合は >>831 の解釈で OK かと。
while ではマッチしたかどうかの判断になるから無限ループになる。
0838nobodyさん2010/12/09(木) 20:54:22ID:???
>>836
>>828 は自分が答えた回答であって、無限ループになってるかもっていう質問者のコードは >>825
08398312010/12/09(木) 21:07:45ID:???
>>837
いや、whileの話のつもりだったんだけど。
while ( ここはスカラーコンテキスト ) { } だろ。
>>825も一応試したが普通に動いたぞ。
/g がなかったら無限ループだけど。
08408362010/12/09(木) 21:21:58ID:???
>>838
そうだった。アンカーミスった。すまん。
>>839
だからたぶん、元のコードにバグがあって (/g のつけ損ねとか)
質問用に捏造した>>825のコードではバグのないコードを書いてしまったんだろう。
と推測する次第。そうだとすると最低な質問の仕方だよな、とプチ憤ってしまった。
0841nobodyさん2010/12/09(木) 21:28:12ID:???
ほんとだ
思い込みじゃなくてテストしてみたらちゃんと動いた。
08428302010/12/09(木) 22:03:45ID:???
まあ、実際のコードを晒さないのなら質問にくんなと言いたいけれど
0843nobodyさん2010/12/09(木) 23:50:50ID:???
特定されたくないというのは、宿題を自力でやらなかったのがバレると困る、とか
そんなような理由なんだろうな、たぶん。
08448412010/12/10(金) 01:49:22ID:???
結局は宿題は出来たからいいや

でフェードアウト的な?
むぅ。。。w



while(/〜/g){ 〜 } がちゃんと回ってくれるっていう事を知れたので、
自分的には有用な流れだった。
0845nobodyさん2010/12/10(金) 08:34:17ID:???
質問です
TreeBuilderを使っているのですが、文字化けが微妙な頻度で発生しており
原因の検討が付かず困っています
何かアドバイスがありましたらお願いします
環境はWindowsXP Home、ActivePerl最新verです

以下ソースです
###################
use LWP::Simple;
use HTML::TreeBuilder;
use encoding qw(utf-8);
$uri = "http://blog.esuteru.com/archives/1866797.html";
$tempfile = "getstore.html";
getstore($uri, $tempfile);
my $tree = HTML::TreeBuilder->new;
$tree->parse_file("getstore.html");
for $attr($tree->look_down("class", "article-outer-3")){
$text = $attr->as_HTML('<>&', "\t");
print $text;
}
###################
続きます
08468452010/12/10(金) 08:35:50ID:???
>>845の続きです
$uriでアドレス指定した某ブログのとあるエントリを「getstore.html」というファイル名でローカルに保存し、
それをTreeBuilderでエントリ部分だけを抽出して出力する、というものです
上記ソースを「test.cgi」、文字コードUTFで保存し、コマンドライン上で、
>perl test.cgi > test.html
と実行し、出力されたtest.htmlを文字コードUTF前提で開くと一部だけが文字化けしています(下記画像参照)
ttp://www.dotup.org/uploda/www.dotup.org1292408.jpg

当然ですが、元となるページ(ttp://blog.esuteru.com/archives/1866797.html)では該当部分は文字化けしていません
また、この現象は以下に挙げたごく一部にのみ発生し、同ブログ内の他の殆どの記事では何故か発生しません

ttp://blog.esuteru.com/archives/1841660.html
・バグの発生手順の部分2カ所
ttp://blog.esuteru.com/archives/1833321.html
・「(「明日のよいち!」「神のみぞ知るセカイ」他)」の担当者名(「脚本:橋龍也」の部分)
・「◆3DSスパ4」の箇条書きの一部

特定の文字、あるいは複数の文字の組み合わせで発生するような気がするのですが、
当方のスキルではこれが限界でした
思い当たる点ならば何でも結構ですので、アドバイスをお願いいたします
08478452010/12/10(金) 08:46:44ID:???
>>846の補足です
発生状況のスクリーンショットです

> ttp://blog.esuteru.com/archives/1841660.html
> ・バグの発生手順の部分2カ所
ttp://up3.viploader.net/net/src/vlnet004648.jpg

> ttp://blog.esuteru.com/archives/1833321.html
> ・「(「明日のよいち!」「神のみぞ知るセカイ」他)」の担当者名(「脚本:橋龍也」の部分)
ttp://up3.viploader.net/net/src/vlnet004650.jpg

> ・「◆3DSスパ4」の箇条書きの一部
ttp://up3.viploader.net/net/src/vlnet004649.jpg
08488452010/12/10(金) 08:48:47ID:???
>>847、2枚目と3枚目のスクリーンショットを逆にしてしまいました…
適時読み替えて下さい…
0849nobodyさん2010/12/10(金) 10:56:09ID:???
とりあえずのヒントになるかな。
化けてる行のHTMLソースを見ると、?みたいな数値文字参照があるな。
これが関係していそうだな。
0850nobodyさん2010/12/10(金) 10:58:22ID:???
あれ化けちゃった。失敗失敗。
例えば「&#9314;」(←実際には半角)みたいな文字参照のある行で化けちょる。
0851nobodyさん2010/12/10(金) 16:37:59ID:???
まったくの勘だけど、とりあえずスクリプトの始めのほうにこれ書き加えてみたらどうなる?

use Encode::Alias;
define_alias( qr/s(hift.*)?jis$/i => '"cp932"' );
0852nobodyさん2010/12/10(金) 16:52:56ID:???
あー全然ちゃんと読んでなかった。
ソースは2chとかじゃなくて元からUTF-8のまとめブログか。じゃあ>>851は意味ないわ。
08538512010/12/10(金) 17:30:19ID:???
文字参照のデコード時にutf8フラグあるなしが混ざるせいで化けてるってことなので、
とりあえず結論としては $tree->parse_file のかわりに
my $html = do { local $/; open my $fh, "<", $tempfile; <$fh> };
$tree->parse(Encode::decode_utf8($html));
とすればとりあえず期待通りに動く。
0854nobodyさん2010/12/10(金) 19:49:59ID:???
<a href="〜"></a><a href="〜"><img src="〜〜〜"></a>

っていう部分があって、<img> を囲ってる <a> は残して、<a></a> となってるものだけ削除したいと思って

s/<a .*?><\/a>//gi

ってやったんだけど、<img> を囲ってる <a></a> まで削除されてしまいます。


s/<a .*?"><\/a>//gi

これだと意図する動き (<img> を囲う <a></a> は残す) になります。


EmEditor の正規表現検索で試したところ、Perl と同じ動きになりました。


s/<a .*?><\/a>//gi のどこが駄目なのか分かりません。。。
■ このスレッドは過去ログ倉庫に格納されています