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

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

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001nobodyさん2010/06/05(土) 21:11:10ID:???
Perlのコーディングで困ってる人のスレです。

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

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

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

お勧めサイトは >2 以降

前スレ http://pc11.2ch.net/test/read.cgi/php/1251989472/
0889nobodyさん2010/12/17(金) 17:36:30ID:???
>>888
実行環境と渡す内容によるし、繋げずに渡してもいい。
print $str1, $str2;
強いて言うなら、特定の条件下でカリカリにチューニングしたいわけでないなら
「読みやすいように」書くといい。
08908882010/12/17(金) 17:43:29ID:???
>>889
ケースバイケースって事ですね。
ありがとうございます。
0891nobodyさん2010/12/18(土) 00:07:20ID:qL35dvRo
1、入力された数値の数だけフレーム分割した画面を表示したいです。
2、テキストタイプのinputで数字をname="number"で受け取り
cgiで<frame>のタグを繰り返すという内容にしたつもりです。
(内容は下記の状態になってます。)
3、しかし、実行結果のページでは何も表示されません。
何がいけないのかご指摘お願いします。

read(STDIN,$str,$ENV{"CONTENT_LENGTH"});
$str=~tr/+/ /;
$str=~s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("c",hex($1))/eg;

foreach (split(/&/,$str)){
my ($key,$value)=split(/=/,$_);
$input{$key}=$value;
}

$height=100/$input{number};

print "<html>\n";
print "<head><title>first_result</title></head>\n";
print "<frameset rows=\""."$height%,"x($input{number}-1)."$height%\">\n";
for($n=0;$n<$input{howmany};$n++){
print "<frame src=\"second_part.html\" name=\"second\">\n";
}
print "</frameset>\n";
print "</html>\n";
0892nobodyさん2010/12/18(土) 04:56:26ID:???
$input{howmany}でループを回しているから
0893nobodyさん2010/12/18(土) 05:40:58ID:???
そういうつまらんミスで時間を無駄にしないためにも
せめて use strict; くらいは使おうぜ
0894Perl忍者 ◆M5ZWRnXOj6 2010/12/18(土) 14:12:29ID:lZZb3And
perlのスレってネトゲみたい
0895nobodyさん2010/12/18(土) 22:45:42ID:eFFNyC2E
正規表現について質問です
以下のソースを実行しているのですが…

#========
my $text = "10a|10b|10c";
$text =~ /(10.)/g;
print $1;
print $2;
print $3;
#========

「"10"で始まり、その次の1文字まで含めた値」を全て取得したいのですが、
出力されるのは何故か$1だけで、$2以下は「Use of uninitialized value」とエラーが出てしまいます
マッチした部分は特殊変数$1、$2、$3…と順次格納されると考えていたのですが…
どの部分がおかしいのでしょうか?
0896nobodyさん2010/12/18(土) 23:05:25ID:???
>>895
パターン内にあるキャプチャ用のカッコが1つだけだから $2 以降は使われないよ。

my @matches = $text =~ /(10.)/g;
print "@matches\n";

こんな風に配列に入れたらどうかな。
0897nobodyさん2010/12/18(土) 23:12:09ID:eFFNyC2E
>>896
自分の正規表現の理解が間違っていたようです
配列で取得する必要があったのですね
ありがとうございました
0898nobodyさん2010/12/19(日) 01:56:11ID:???
一括取得ではなく順ぐりに1つずつ処理でもいいなら
while($text=~/(10.)/g){print $1;}
以上蛇足
0899nobodyさん2010/12/19(日) 17:16:51ID:???
i
0900nobodyさん2010/12/20(月) 04:07:28ID:???
>>890
速度的には「,」繋ぎが速いらしいね
""でくくると変数の範囲をチェックするし、「.」で繋ぐと変数の中身を判断するんで、その分遅くなるのだそうな
0901nobodyさん2010/12/20(月) 12:51:46ID:klkFZZbW
perl5.8.8で、use utf8としてutf8でソースを書いています。
その中で文字列を生成→出力と単純な処理を行っているのですが、文字列がある一定の長さを
越えた辺りで、iso-2022-jpで出力するとその長さ前後の数文字だけ\b{xxxx}の形に文字化けします。
eucやutf8で出力すると、化けません。
また、適当な長さのところに改行を入れると、iso-2022-jpでも文字化けしません。
これってどういう現象なのでしょうか..解決先を御存じ、または同じ現象に遭遇した方いらっしゃいますでしょうか。
0902nobodyさん2010/12/20(月) 12:57:22ID:klkFZZbW
>901
すいません、化け方は\x{xxxxx}の間違いです。やはり直前の改行以降300文字前後で化けます。
0903nobodyさん2010/12/20(月) 13:06:16ID:klkFZZbW
>901
実験にこんなプログラムを書きましたが、再現しました。340文字で改行するとOKでした。

#!/usr/bin/perl
use strict;
use Encode;
use utf8;

binmode STDOUT,":encoding(iso-2022-jp)";
my $x;
for(my $i = 0; $i < 1000;$i++){
$x .= "あ";
}

print $x . "\n";
0904nobodyさん2010/12/20(月) 14:28:44ID:???
>>903
手元のlinux上の5.10.1で動かしてみたが別に変なことはないけどな。
プログラムは特になんの変哲もないから、現象が本当ならなにかの
バグぐらいしかおもいつかない。バージョンや環境は?
0905nobodyさん2010/12/20(月) 14:32:42ID:klkFZZbW
>904
RedHat ES4 + perl-5.8.5と、FreeBSD 5-STABLE + perl 5.8.8の2つの環境で
確認しました。
perlのバグですかね・・・。うーん。
0906nobodyさん2010/12/20(月) 15:19:18ID:???
Encode.pm で落ちてるみたいだけど・・。
does not map to euc-jp at /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/Encode.pm line 158.

途中で euc にマッチするコードになるんだろうか?


binmode を使わないで、最後の方をこうするしかないみたい。
-------------
utf8::encode($x);
Encode::from_to($x, 'utf8', 'iso-2022-jp');
print $x . "\n";
-------------
0907nobodyさん2010/12/20(月) 15:25:33ID:klkFZZbW
>906
最新のEncode.pm(2.40)でもdoes not map to euc-jpと出ました。
5.10.1でOKということはEncode.pmの問題じゃなくて本体の方の問題ですかね。

>binmode を使わないで、最後の方をこうするしかないみたい。

なるほど、確かにこちらならOKでした。
出力先がフィルターやファイルなのでこのまま書き直してうまく行くか確認が
必要ですが、こちらの方で動くか試してみます。ありがとうございます!
0908nobodyさん2010/12/20(月) 18:35:18ID:???
content-type が Shift_JIS とか指定してたりして。。。
0909nobodyさん2010/12/21(火) 01:22:26ID:???
再現した
v5.8.8 built for i386-linux-thread-multi
Encode 2.40
0910nobodyさん2010/12/21(火) 03:00:18ID:???
それPerlIOの仕様で1024バイト目でぶっちぎれてるんでしょ。
http://blog.livedoor.jp/dankogai/archives/51231739.html

>>906の言うようにbinmodeを使わないのが正解。
utf8::encodeしてfrom_toとかじゃなくて print encode("iso-2022-jp", $x) のほうがいいと思うけど。
0911nobodyさん2010/12/21(火) 06:28:50ID:???
>>910
すごい。勉強になった。
0912nobodyさん2010/12/21(火) 09:05:29ID:???
>>910
自分でencode関係のモジュール作るときは気をつけろって話じゃないの?
さすがにちぎれたからって結果がおかしくなるようなものが標準添付なのは
どうかと思うな。
0913nobodyさん2010/12/21(火) 09:35:50ID:???
元質問者です。
>910
なるほど・・勉強になりました。
0914nobodyさん2010/12/21(火) 17:40:31ID:???
WWW::Mechanize を使ってフラッシュプレイヤーがインストール済み
であるかのように振舞うにはどうしたらいいのでしょうか?
0915nobodyさん2010/12/22(水) 08:58:19ID:???
>>914
普通のブラウザでアクセスしたときの通信内容をよく観察して
真似すればたいていなんとかなる。
0916nobodyさん2010/12/22(水) 09:00:32ID:???
大概Javascriptで判定されてるからあんまり気にしなくてもいいんじゃない
0917nobodyさん2010/12/22(水) 11:08:37ID:???
WWW::Mechanize が JavaScript をエミュレートしてくれればねぇ。。。
0918nobodyさん2010/12/23(木) 10:41:19ID:???
utf フラグが付いた文字列を LWP に投げるとエラー出るのね

1時間ぐらい悩んだわ
0919nobodyさん2010/12/25(土) 00:42:21ID:???
use utf8 すると、
use CGI::Carp qw(fatalsToBrowser);
がうまく動かないんですね。

%test ってだけすると Internal Server Error としか出ず。
use utf8 を外すと

Global symbol "%test" requires explicit package name at test.cgi line 25.
Execution of test.cgi aborted due to compilation errors.

ってちゃんと出る。

むぅ。。。
0920nobodyさん2010/12/25(土) 01:59:19ID:???
$ perl test.cgi
0921nobodyさん2010/12/25(土) 04:32:14ID:???
あらほんとだ。 表示された。。。
逆になんでブラウザだと表示されないのか、それはそれで疑問がw
0922nobodyさん2010/12/25(土) 04:48:35ID:???
use utf8;
0923nobodyさん2010/12/25(土) 04:57:06ID:???
それは外せない。
0924nobodyさん2010/12/26(日) 16:40:31ID:0uuAPxVP
       ■ 2chに韓国猿降臨 ■

 Flash板のスレッドにバカチョンが降臨しました、
スレッドは以下のスレです。

2009年 紅白FLASH合戦 新企画・反省スレッド
http://hibari.2ch.net/test/read.cgi/swf/1262431858/l50

 上記スレッドの281が韓国猿で、
> 来年 12月 11日に全域します. 後でみなさんと共にできますね.
等とほざいています、是非煽って煽りまくって火病らせてあげてください^^
09258912010/12/28(火) 04:26:30ID:???
>>892,893
遅くなりましたがアドバイスありがとうございました
0926nobodyさん2011/01/02(日) 02:18:19ID:???
明けましておめでとうございます
AmigoDatabaseを使ってデータベースに興味をもち、CSV形式で
1項目あたり2000個くらいの要素を抱えていて全部で1万項目
くらいのデータベースになりました
それぞれの要素は原則文字列なのですが時々数値が混じります
この数値を足し算したい場合、個々の数値が連想配列だとしたら
どのようにすれば良いのでしょうか
質問の仕方があいまいですみません
0927!omikuji2011/01/02(日) 07:35:30ID:???

0928nobodyさん2011/01/02(日) 14:45:17ID:???
>>926
>>1-2
http://perldoc.jp/docs/perl/5.10.1/perlfaq.pod
0929nobodyさん2011/01/03(月) 00:07:46ID:???
abcdefg

っていう文字列に対して

cdefg を検索し、efg を xyz に置換

っていうのはどうかけばいいんでしょう?
0930nobodyさん2011/01/03(月) 00:17:22ID:???
my $s = 'abcdefg';
$s =~ s/efg/xyz/
if($s =~ /cdefg/);#cdefgを検索

こうですか
0931nobodyさん2011/01/03(月) 00:22:50ID:???
いつも
my $s = 'abcdefg';
$s =~ s/(cd)efg/$1xyz/;
みたいな感じでやってる
0932nobodyさん2011/01/03(月) 00:27:26ID:???
$s =~ s/cdefg/cdxyz/g;
では不満なのか

あえて特殊エスケープとかつかうなら
$s =~ s/cd\Kefg/xyz/g;
または
$s =~ s/(?<=cd)efg/xyz/g;
0933nobodyさん2011/01/03(月) 00:30:47ID:???
はいw
s/abcdefg/abcdxyz/;
0934nobodyさん2011/01/03(月) 01:31:06ID:???
スクレイピングで色々やってんだけど、記事を持ってくるサイトが
頻繁に CSS のクラス名を変えたり、順番を変えたりするもんで、
修正漏れに気がつかずにハマったので、一致するけど
置換は行わない部分の指定が出来れば。と思った次第です。

なので、>>932 さんの方法を試してみます。
09359312011/01/03(月) 01:49:54ID:???
>>932
おぉ。そんな感じにできるんだ。すげぇ。
perldoc perlre見たらちゃんと書いてあった。勉強になった。
For instance
s/(foo)bar/$1/g;
can be rewritten as the much more efficient
s/foo\Kbar//g;
09369322011/01/03(月) 02:46:25ID:???
あーでも\K使えるのはPerl5.9.5以降だから一応注意な。
0937nobodyさん2011/01/03(月) 08:19:04ID:???
\Kは*や+といったメタ記号も使えるから便利だね。
否定形は何故作らなかったのだろうか。
0938nobodyさん2011/01/03(月) 12:15:50ID:???
否定だと普通にマッチして場所覚えるだけじゃ
すまなくなるからじゃないかな。
0939Perl忍者 ◆M5ZWRnXOj6 2011/01/03(月) 16:28:47ID:jfo7ol9+
gfx君←(笑)
0940nobodyさん2011/01/04(火) 14:59:21ID:???
コンソールで Term::Screen 使ったあとに vim を使うと
日本語入力ができなくなっているのですがどうすれば良いでしょう?
何かもとに戻す手続きはあるのでしょうか?

$ cat ./ScreenApp.pl

#!/usr/bin/perl
use Term::Screen;
my $scr = new Term::Screen;

$ ./ScreenApp.pl

画面描画

$ vi

で “あ[Enter]” と入力すると “c^B” と表示されて
「まだテキストが挿入されていません」とエラー
0941nobodyさん2011/01/04(火) 15:07:36ID:???
おい、早く質問に答えろ
0942nobodyさん2011/01/04(火) 15:25:09ID:???
はい
0943940 ◆GUbG3XWPzc 2011/01/04(火) 15:28:40ID:???
>>941
は自分ではありません。
よろしくお願いいたします
0944940 ◆vx6KgJyjvE 2011/01/04(火) 15:55:48ID:???
>>943
偽?やめてくれませんか?

教えてください
0945nobodyさん2011/01/04(火) 16:03:28ID:???
>>940
試してみたら手元の環境でもおかしくなった。resetコマンドで
直ったけど端末関係は詳しくないので原因とかはわかんね。
何かの状態を書き換えたまま放置とかしてるんだろうけど。

0946 ◆GUbG3XWPzc 2011/01/04(火) 16:31:45ID:???
ご報告ありがとうございます
reset コマンドは初耳でしたが有効でした
09479262011/01/05(水) 02:24:02ID:???
>>928
リンク先の>>1-2は別として、有用なリンクを教えて頂いてどうもありがとうございます。
Perlをよくご存知の方なら知っていて当然のリンクも分からないのが今の自分なんです。
これから精進します。
0948nobodyさん2011/01/06(木) 09:58:08ID:???
my $in = new CGI;
ってやった時に $in から ENCTYPE を調べる方法ってありますか?
あと GET と POST を同時受け取るのって、CGI からは無理?
<form method="POST" action="aaa.cgi?opt=1">
みたいので呼び出したいのですが。。。
0949nobodyさん2011/01/06(木) 11:21:12ID:???
query stringじゃないといけないんですか、<input type=hiddenでは駄目なんですか?
0950nobodyさん2011/01/06(木) 12:07:30ID:???
作り方が悪いのは承知ですが、処理の振り分けのオプションは GET で渡してて、
機能追加でファイルアップロードを付けようとしてるしだいで、GET で渡す部分は
弄りたくは無いなと・・・
0951nobodyさん2011/01/06(木) 12:27:29ID:???
>>948
request_methodとurl_paramでなんとかなるだろ。
詳しくはマニュアル嫁
0952nobodyさん2011/01/06(木) 12:36:05ID:???
お〜 url_param がまさに求めてたやつ!!
thx!
0953nobodyさん2011/01/10(月) 17:44:08ID:???
2chソースくれ
0954nobodyさん2011/01/10(月) 19:35:07ID:???
>>953
【速報】bbs.cgiのソースが流出 ついに来たか・・・
http://hato.2ch.net/test/read.cgi/news/1294647372/

ここからDLできる
0955nobodyさん2011/01/11(火) 22:48:54ID:???
半角記号をパターンマッチさせたいのですが、上手くいきません。
Perlどころか正規表現の扱い方すら覚え始めなので、根本的に間違ってるかも知れませんが

if ($value =~ /[@-/]/)
if ($value =~ /[\@-\/]/)
if ($value =~ [@-/])

どれもエラーが出てしまいます。
模範的な書き方としてはどうすればいいのか、お教え願えませんか
0956nobodyさん2011/01/11(火) 23:17:24ID:???
>>955
どの範囲にマッチさせたいのかわからない。
http://e-words.jp/p/r-ascii.html

^@ で表したりする NUL(\x00) と @(\x40)はちがうよ。
0957nobodyさん2011/01/11(火) 23:23:27ID:???
/ はエスケープ
@はそのまま
-を3文字の中央に配置すると範囲指定になるので、エスケープするか最初に配置
0958nobodyさん2011/01/12(水) 00:04:41ID:???
>>956-957
お早いご回答、ありがとうございます。

$valueが
半角記号を含むかどうかを判別したいと思っていましたが
どうやら間違えていたのでしょうか
ttp://jp.layer8.sh/reference/entry/show/id/1121
こちらを見て
[@-/] で @!"#$%&'()*+,-./ をマッチ出来ると思っていました。



それならばとりあえず@は省くとしたら、

if ($value =~ /[!-\/]/)

これで !"#$%&'()*+,-./ を含むかどうか、を判別出来ると思ったのですが、
今度はエラーは出ないものの、マッチしてくれません。

基本的すぎるのか、
perl 半角記号 パターンマッチ 正規表現
あたりのキーワードでググってみても、いまいち解り易いページに辿り付けなくて難儀してます。
0959nobodyさん2011/01/12(水) 00:14:06ID:???
ん?どうなって欲しいんだろう。\x21-\x2fの範囲内のが混ざってたら真が返るはずだけど。
0960nobodyさん2011/01/12(水) 00:17:44ID:???
$value =~ m{[@-/]};
Invalid [] range "@-/" in regex; marked by <-- HERE in m/[@-/ <-- HERE ]/ at - line 1.

エラーになるのか。初めて知った。
0961nobodyさん2011/01/12(水) 00:18:13ID:???
[\x21-\x2f]
[\x3a-\x40]
[\x5b-\x60]
[\x7b-\x7e]

これが記号かな?
09629552011/01/12(水) 00:38:59ID:???
>>959
申し訳ない、ちゃんと正しい結果が返っていました。
こちらの確認不足でした。

>>961
こう16進数で表記してマッチさせる事も出来るんですか。
より幅広くチェック出来そうなので、色々試してみます。




とりあえず、したかった事はどうにか上手くいきそうです。
皆様ご助言、ありがとうございました。
0963nobodyさん2011/01/12(水) 18:05:54ID:???
LWP で $ua->proxy('http', 'http://' . $proxy) のように Proxy をセットしたものの、
後々解除したいときってどうすればいいんでしょう?

$ua->proxy('http', '') とかでよかったりします?
0964nobodyさん2011/01/12(水) 19:23:23ID:???
ためしてみりゃいいじゃん
0965Perl忍者 ◆M5ZWRnXOj6 2011/01/12(水) 21:33:48ID:Icf1UA6A
ためしてみりゃいいじゃん
0966nobodyさん2011/01/14(金) 00:08:21ID:???
モジュールの命名規則についての質問です。
自分用のモジュールを用意しようと考えています。

オブジェクト指向のものを「Object::○○」に置き、
関数指向のものを「Function::○○」か「Utility::○○」に置こうと考えています。

問題点や、別の考え方、流行などがあればご指摘おねがいします。
0967Perl忍者 ◆M5ZWRnXOj6 2011/01/14(金) 00:29:01ID:???
ガッチガチですね^^;
0968nobodyさん2011/01/14(金) 00:37:38ID:???
>>966
http://perldoc.jp/docs/perl/5.10.0/perlnewmod.pod
>・Choose a name
> (名前を決める)
> CPAN に含まれる Perl モジュールには、命名階層があり、それに合わせる必要があります。
> これがどのように整理されているかの詳細は、perlmodlib を参照してください。
> また、CPAN やモジュールリストを見て回って、どんなものか触れてみてください。

http://search.cpan.org/

http://perldoc.jp/docs/perl/5.10.0/perlmodlib.pod
> ・モジュールのための名前を選択しましょう。

> 関連したモジュール/クラスの一揃えを開発するのであれば、それは名前空間を破壊することを
> 防ぐような一般的なプリフィックスを持つネストしたクラスを使うよい練習になるでしょう。たとえば
> Xyz::Control, Xyz::View, Xyz::Model といったものです。

> もしプライベートな内部やプロジェクト固有の用途のために開発中のモジュールが決して公開
> されることがないなら、将来の公開モジュールと名前が衝突しないことを確実にしてください。
> これは、予約済みの Local::* カテゴリを使うか、 Foo_Corp::* のように名前に下線を含める
> ことで行えます。
0969nobodyさん2011/01/14(金) 01:10:22ID:???
>>968
回答ありがとうございます。
公開予定のないモジュールですので、名前に下線を含める方向で検討したいと思います。
0970nobodyさん2011/01/14(金) 01:34:59ID:???
while($html =~ s/<br \/><br \/><br \/>/<br \/><br \/>/){
print '.';
}

連続した3つの改行タグを2つの連続した改行タグに置換しようとしてるんだけど、
改行タグが置換されません。
0971nobodyさん2011/01/14(金) 02:12:58ID:???
>>970
こういうのじゃだめかしらん?

$html =~ s/<br \/><br \/><br \/>/<br \/><br \/>/gm;
print $html;
0972nobodyさん2011/01/14(金) 03:21:44ID:???
セルフ以外の値を得る場合に、アクセサのゲッターメソッドを使うという制約をつけてみようと思いました。
こういったやりかたが一般的かどうかを知りたいので、賛成意見、反対意見などがありましたら、宜しくお願いします。

ファイル操作で例えると以下のような感じです。(※セルフ=blessしたクラス名、括弧内の$は引数の有無を表している)

-- FILEクラス --
new() .................セルフを返す
set_filename($) ..セルフを返す
set_filedata($) ...セルフを返す
get_filename() ....値を返す
get_filedata() ......値を返す
read() .................セルフを返す
write() ................セルフを返す

-- サンプルコード --
my $file = FILE->new->set_filename("./aaa.txt")->set_filedata("bbb")->write->read;
print $file->get_filename . "n" . $file->get_filedata . "n";
0973nobodyさん2011/01/14(金) 07:35:58ID:???
メソッドチェーン?
0974nobodyさん2011/01/14(金) 17:50:11ID:???
>>973
そそ、メソッドチェーン。
セルフを返すメソッドと返さないメソッドが混在するのがモヤモヤするから質問してみた。
それだったら、アクセサだけで対応しようかなとおもったわけで。
井の中の蛙なので、外の情報が欲しいのです。
0975nobodyさん2011/01/14(金) 18:22:33ID:???
この例だとあえてメソッドチェインを使うメリットはない気がするけど、
それは置いといてもset_*でselfが返ってくるのはキモいと思う。
0976nobodyさん2011/01/14(金) 18:55:04ID:???
>>971
それでも駄目でした。
ん〜なんだろ。。。
0977nobodyさん2011/01/14(金) 19:00:21ID:???
本当に解決したいと思ってんなら$htmlの当該部分を書けよボケ
0978nobodyさん2011/01/14(金) 20:21:04ID:???
>>977
my $html =<<"EOM";
aaa<br /><br /><br />aaa<br /><br /><br />aaa
bbb<br /><br /><br /><br /><br /><br />bbb
EOM

テストするなら、$htmlの中身はこんな感じのを入れればいいんじゃね?
while使う理由がわからんけど、while使ったら、改行タグ減りまくりになりそう。
0979nobodyさん2011/01/14(金) 20:27:11ID:???
>>978
>>977が言いたいのは「htmlがおかしいんじゃねぇの?」ってことでしょ
解決するような世紀表現出しても元がおかしくてダメだと解決しないからってことで
0980nobodyさん2011/01/14(金) 23:05:32ID:???
>>978
あー、部分的なコードだけみても、対応できないってことか。
0981nobodyさん2011/01/15(土) 01:05:53ID:???
>>978
改行タグを減らしまくるのが目的です

$html の中身はブログから持ってきたデータで、<br /> を削除する前に
s/\r|\n|\t//g で改行コードとタブコードを全部削除して1行にしてあります。

で、処理するデータはデバッグとしてファイルに書き出して、目視で削除したい <br /> の連続があるのを確認済みです。
0982nobodyさん2011/01/15(土) 01:09:23ID:???
お客様の中にエスパー様はいらっしゃいませんかー
0983nobodyさん2011/01/15(土) 01:53:54ID:???
>>981
とりあえず、問題点を予想してみた。

・テキスト側が、<br />ではなく<br>(半角スペースとスラッシュをつけていない)
・テキスト側が、<br />ではなく<br/>(スペースの入れ忘れ)
・質問者のサーバーがMac。を入れるところを\マークにしている。
・エラーコード500である。
・strict宣言をしているのに、変数を初期化していない。

<<982
いや、まさかな
・元になるテキストの、<br />と<br />の間にスペースが入っていたりして。

とりあえず、改行タグを取る前の内容を出力してみてはどうでしょう?
0984nobodyさん2011/01/15(土) 06:05:42ID:???
>>981
$html =~ tr/\t\n\r / /s; # 改行、TAB、空白の圧縮
$html =~ s/^ | $//g; # 先頭と末尾に空白があれば削除
$html =~ s/(?<=>) (?=<)//g; # タグ間の空白を削除
$html =~ s|(?:<br\b[^>]*>){3,}|<br /><br />|gi;
0985nobodyさん2011/01/15(土) 08:03:36ID:???
>>983
んー。試したら、普通に動いてしまった。気のせいだろうか。
おいらの結論としては、$htmlの中身、ブログのテキストをうまくとりこめてないのかなと。
ファイルが原因だとしたら、デコードやエンコードを失敗してるのではないでしょうか。
そうでなければ、余計な文字列が紛れ込んでいるのかなと。

0986nobodyさん2011/01/15(土) 08:05:58ID:???
>>985
安価まちがえた
>>984
0987nobodyさん2011/01/15(土) 09:59:19ID:???
>そうでなければ、余計な文字列が紛れ込んでいるのかなと。
だから >>984 は空白を削除したり[^>]*で余計な文字列が紛れ込んでてもマッチするようにしてるんじゃないか
0988nobodyさん2011/01/16(日) 03:20:10ID:lrCOl2/v
質問させてください
perlでCGIを作っているのですが、
アクセスしてきた人が、どんなHTTPヘッダーを送ってきているのか調べたいのですが、
ページにアクセスされた時にHTTPヘッダーの取得する方法はどうすればいいでしょうか?
レス数が950を超えています。1000を超えると書き込みができなくなります。