トップページ⇒tech
1001コメント281KB

Perlについての質問箱 52箱目

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2012/05/06(日) 10:21:12.81
CGI についての質問は板違いです。WEB プログラミング板でどうぞ。
CGI と Perl の区別がつかない人も WEB プログラミング板に行ってください。
(WEB プログラミング板: http://hibari.2ch.net/php/ )

このスレでは(CGI 以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。

"The duct tape of the Internet" こと、Perl についての質問箱です。
"There's more than one way to do it" ということで、
Perl の奥深さについて皆で語り合い、追求してまいりましょう。

http://www.perl.org/get.html
Download Latest Stable Source (5.14.2)

▼ 前スレ
Perlについての質問箱 51箱目
http://toro.2ch.net/test/read.cgi/tech/1330666216/

リンク集は >>2-3
Perl 日本語処理の基礎の基礎 >>4
0153デフォルトの名無しさん2012/05/22(火) 08:26:35.41
>>152
朝早くから返信有難う御座います!
とりあえずWperlで実行するように関連付けと拡張子を変えてみました。
やっぱりほんの一瞬だけプロンプトが出ますが、Perl.exe出実行するより断然短かったのでこれで行こうと思います。
Joinもスクリプトに書いてみたところ上手く分割されずにできてました!
半角スペースと全角スペースの分で2列書くことになりましたけど満足です。
ありがとうございましたm(_ _)m
0154デフォルトの名無しさん2012/05/22(火) 13:18:33.12
start /b cmd /c c:\perl\bin\wperl とかって使えるのかな?
0155デフォルトの名無しさん2012/05/22(火) 14:00:45.95
なんでやってみないのw インストールしてない??
0156デフォルトの名無しさん2012/05/22(火) 15:01:41.25
今使ってるパソコンでは試せないの。家に帰ってからでないと
0157!ninja2012/05/24(木) 12:48:14.92
華氏から摂氏への温度変換や、割り勘精算のプログラムが乗っているサイトや本はありますか?
その他色々なプログラムの見本が乗っているものがほしいです。
0158デフォルトの名無しさん2012/05/24(木) 13:26:08.68
>>157
>>2-3やgoogle検索は?
0159デフォルトの名無しさん2012/05/24(木) 15:39:54.91
質問です。
Net::FTPで

$ftp->get(target,local);

とやってダウンロードせずに、targetの中身をそっくり変数(たとえば$temp)にぶち込む方法ってありませんか?
対象は4kbほどのテキストファイルです。


よろしくお願いします。
0160デフォルトの名無しさん2012/05/24(木) 16:32:36.93
use IO::All;
use IO::All::LWP;
print io("ftp://ftp.freebsd.org/pub/FreeBSD/ports/amd64/packages-8-stable/INDEX.bz2.md5")->all;
0161デフォルトの名無しさん2012/05/24(木) 16:32:54.81
>ダウンロードせずに
0162デフォルトの名無しさん2012/05/24(木) 16:43:47.43
>>2-3の半分ぐらいはもう腐った情報なんだが
スレ立てる奴が誰一人気にしないという恐怖
0163デフォルトの名無しさん2012/05/24(木) 17:13:12.98
>>162
そしてオマエに「オレが書きなおしてやる!」という気概がない
という恐怖
0164デフォルトの名無しさん2012/05/24(木) 17:14:30.56
>>160
ありがと。
難しいな…


>>161
ごめん。
× ダウンロードせずに
○ ファイルとして保存せずに
0165デフォルトの名無しさん2012/05/24(木) 17:38:00.94
よぉぉし、ではこれでどうだ。
use Net::FTP;
my $ftp = Net::FTP->new("ftp.freebsd.org");
$ftp->login("anonymous",'-anonymous@');
my $temp = do {
my ($rfh, $wfh);
pipe($rfh, $wfh);
$ftp->get("/pub/FreeBSD/ports/amd64/packages-8-stable/INDEX.bz2.md5", $wfh) or die "get failed ", $ftp->message;
close $wfh;
local $/;
<$rfh>;
};
print $temp;
0166デフォルトの名無しさん2012/05/24(木) 17:55:50.94
よくわからんが俺なら
どうしてもHDDを経由したくなければRAMDISK
それもいやならSTDOUTに吐いてもらうスレッド別個に走らせて
パイプ介して受け取るとか試すかなあ
可能性や容易性とかさっぱり予測つかんが
0167デフォルトの名無しさん2012/05/24(木) 19:07:06.68
>>158
調べてはみましたが自分では欲しい情報が見つからなかったので質問させてもらいました
0168デフォルトの名無しさん2012/05/24(木) 21:23:30.73
>>159
open(my $fh, '>', \(my $temp)) or die $!;
...
$ftp->get($path, $fh) or die("get failed ", $ftp->message);
$ftp->quit;
$fh->close;

print $temp;
0169デフォルトの名無しさん2012/05/25(金) 00:02:49.64
難しいことしなくても LWP の get で出来そうな気もするが
0170デフォルトの名無しさん2012/05/25(金) 00:28:05.21
俺もFTPにこだわる必要性がないように思った
01711652012/05/25(金) 01:01:27.45
>>168 負けました・・・

ポトペタしたコードに変更を加えるには「難しい」ということでしょ。
0172デフォルトの名無しさん2012/05/25(金) 14:14:00.44
>>165
ありがとう。
doの使い方、いろんな本読んだ中で、これが一番わかりやすい気がする…


>>166
大きいファイルの時(アクセスログなど)の時は一度ファイルに書き出してからそれを開いているのですが、十分に小さいから直接やりたいなって。


>>168
ありがとう!

> '>', \(my $temp)
がわからなくて、何度やってもうまくいかなかった。


>>169
>>170
このファイルのパーミッションが600。
そして置いているのはドキュメントルートの外。
一般には読みだされたくない情報ファイルなのよ。


みんなありがとう。がんばってみます。
0173デフォルトの名無しさん2012/05/25(金) 14:19:08.66
>>172
な?どんな本よりもこのスレの方がはるかに役に立つだろ?
0174デフォルトの名無しさん2012/05/25(金) 16:27:58.28
人のプログラムだけど
<=>
てのがあった。
ぐぐっても無かった。

どうゆう(演算子)?
0175デフォルトの名無しさん2012/05/25(金) 16:32:04.20
cmp
0176デフォルトの名無しさん2012/05/25(金) 16:38:55.04
>>174
>>175で大体おk。ただし==とかと同じく数値で比較。

で、こういう演算子系はperldoc perlopで調べるもの今後覚えておくべし。
ttp://perldoc.jp/docs/perl/5.14.1/perlop.pod
0177デフォルトの名無しさん2012/05/25(金) 17:02:31.17
>>175,176

ソートで使う系か

thx
0178デフォルトの名無しさん2012/05/25(金) 22:24:45.20
decodeとencodeの違い、使い分け方を教えて下さい
0179デフォルトの名無しさん2012/05/25(金) 22:27:17.00
>>178
decode:文字列を内部形式に変換
encode:内部形式の文字列をいろんなエンコードに変換
0180デフォルトの名無しさん2012/05/25(金) 23:56:31.64
デcode は点々がつくのでフラグが点く。
エンcode は点々が点かないのでフラグが落ちる。
煩わしい場合は全部フラグなしで通しても構わない。
その場合はencode、decodeの使い分け方に悩まずに済む。
0181デフォルトの名無しさん2012/05/26(土) 00:20:03.92
標準で trim 関数が欲しいと
0182デフォルトの名無しさん2012/05/26(土) 20:23:21.24
()の入ってる文字列が正規表現Sオプションで置換できないんですがどうすればいいんでしょ
0183デフォルトの名無しさん2012/05/26(土) 20:28:45.72
バックスラッシュでなんとかする
日本なら¥でなんとかする
0184デフォルトの名無しさん2012/05/26(土) 20:34:22.76
[(] もね
0185デフォルトの名無しさん2012/05/26(土) 20:37:19.48
円マーク入れても置換されないんですよね…
\(を他の一文字に変えて代入すると正しく置換されるんですが

$s = "foo\(bar\)";
$b = "foo\(bar\)";

$s =~ s/$b/replace/;
print "$s\n";

出力結果:foo(bar)
0186デフォルトの名無しさん2012/05/26(土) 20:44:38.56
$s = "foo(bar)";
$b = "foo\(bar\)";
$s =~ s/$b/replace/;
print "$s\n";

または

$s = "foo\(bar\)";
$b = "foo\\(bar\\)";
$s =~ s/$b/replace/;
print "$s\n";
0187デフォルトの名無しさん2012/05/26(土) 20:45:23.01
適当なサンプルでも $a $b は使わないようにしませう。
0188デフォルトの名無しさん2012/05/26(土) 20:56:17.91
>>185
http://ideone.com/29qU1

>>186
2番目は合ってる

>>187
ごめんなさい
0189デフォルトの名無しさん2012/05/26(土) 20:58:36.88
試してくれよう...

$pee = "foo[(]bar[)]";
0190デフォルトの名無しさん2012/05/26(土) 22:02:45.21
まじすみません。昨日書いたばっかりのプログラムが意味不明になりました。
一応全て自分で考えて書いた物です。(なぜ1日で分からなくなるんだ?)。
数学的知識が必要と思われます。誰か解説して下さい。
※書き込むために全書くスペースを使ってます。コピーで動作しません。

my ($xx, $yy, $rr_2) = (256, 256, 253); #xとyは円の中心位置。rは半径。
foreach my $rr ( 0 .. $rr_2){              #0から指定された半径の大きさの円までを全て描く
 foreach my $vv ( 0 .. int ($rr / 1.4142 + 0.5) ){  #1.4140 < n < 1.4146, nは不明数値を少なくすれば問題は起きない。
  my $vv2 = int( sqrt(($rr ** 2) - ($vv ** 2)) +0.5 );  #1pixづつずらして計算する要素
  #1/8づつ円周を描画
  $::image->[$xx + $vv]->[$vv2 + $yy] = 2;        #x軸をずらした場合のyの位置を描画
  $::image->[$xx - $vv]->[$vv2 + $yy] = 3;  
  $::image->[$xx + $vv]->[0 - $vv2 + $yy] = 4;
  $::image->[$xx - $vv]->[0 - $vv2 + $yy] = 5;

  $::image->[$vv2 + $xx]->[$yy + $vv] = 6;        #y軸をずらした場合のxの位置を描画
  $::image->[$vv2 + $xx]->[$yy - $vv] = 7;
  $::image->[0 - $vv2 + $xx]->[$yy + $vv] = 8;
  $::image->[0 - $vv2 + $xx]->[$yy - $vv] = 9;

 }
}

半径を1pxずつずらして指定の大きさまでの円を重ねて書くプログラムです。動作します。
数学的知識が全然ないまま手探りで作りました。質問事項は三つです。

1.4142が2の平方根に見えます。自分で探し出した数値なんですかこれはなんですか?
$vvはなにを意味してますか?
$vv2はなんですか?

自分で書いたコメントがついてるにも関わらず、すでにコメントの意味がわからないです。
プログラムの全容が必要なら全部書きますが、分からない箇所はここだけです。
0191デフォルトの名無しさん2012/05/26(土) 22:59:54.41
>>190
無責任にコメント

#1/8づつ円周を描画
にある通り、円を八等分して描画しているんだろう

そんでもって上下左右からはじまって、徐々に斜め方向に
進んでいくんだが斜めの座標は
直角二等辺三角形の辺の比が1:1:√2であることから
√2が関わってる

例えば中心から右少し上の領域はこうなっているわけだ

                          ○←描画点
                          ┃ }$vv 0 〜 半径÷√2
●━━━━━━━━━━━━┛
↑中心点   ↑の長さが$vv2

…当然、右少し下、上少し右、上少し左、左少し上、左少し下、
下少し左、下少し右の残りの7点も似た感じで描画しているんだろう

+1/2はマス目の中心を格子点ではなく格子点の間に置いているイメージなのかな

眠くて頭働いてないから豪快に間違ってるかもしれん
0192デフォルトの名無しさん2012/05/26(土) 23:37:58.45
>>190
三平方の定理(r**2 = x**2 + y**2)が成り立つ点P(x,y)の集合を描画すれば半径rの円が描ける。
円を8等分して描いてるので、x=0から始めてr**2 = x**2 + x**2を満たすxの位置までを描けばいい。
01931902012/05/27(日) 00:04:44.52
>>191
本当にありがとうございます!
私のプログラムなのに私より詳しい!!

√2は、1/8づつ描画するため、直角二等辺三角形になるまでループしろと言うことだったんですか。
よくわからずに適当に数値を打ち込みながら1.4142を出してました。

vv と vv2 は描画するのが真円だから、x軸 でも y軸でもどうでも良かったんですね。
それで x や y を使わないでも v から座標が出るし、
v を x や y だと固定しないことで一回のループから 8個の描画が出来ると…。


なんで私がこんな合理的な処理を作れたんだろう…。
しかも覚えてないわ、自分でも意味分かってないわ、なのに…。
数式の意味も分からないまま、記述だけを見て処理や記述をカットして短く出来そうな所を短くしていった記憶だけはあるんですが。

本当にありがとうございました。助かりました。

>>192
ありがとうございます。数学的に説明されると意味が分かるような分からないような。
0194デフォルトの名無しさん2012/05/28(月) 13:10:15.84
LWP::UserAgent について質問です。

my $ua = LWP::UserAgent->new();
$ua->max_redirect(3);
$ua->agent('firefox12 の UA');
my $req = GET('http://www.youtube.com/');
my $res = $ua->request($req);
my $html = $res->decodec_content( charset => 'utf-8') || '';

このようにして HTML を取得しているのですが、URL Snooper2 で監視してたら、
ページ内にある <img> などにもアクセスを行っていました。

ページ内の src などにはアクセスさせず、純粋に HTML のみが欲しいのですが、
これを抑止する方法は無いのでしょうか?
0195デフォルトの名無しさん2012/05/28(月) 13:20:46.74
その$htmlをどうしているのか
0196デフォルトの名無しさん2012/05/28(月) 13:21:29.13
>>194
それ以前にそのコード動くんですか?
先頭に「use LWP::UserAgent;」を追加しても、こんなエラーが出ます。
Undefined subroutine &main::GET called at ./194.pl line 7.
0197デフォルトの名無しさん2012/05/28(月) 13:28:47.76
HTTP::Request::Common の GET() でしょ
01981962012/05/28(月) 14:07:14.94
>>197
ありがとう
use HTTP::Request::Common;
も追加したら動きました

で、確認してみたんですが、このスクリプトから
img srcを解析してアクセスしている様子はみられませんでした
別のブラウザが動いていたのでは?と思うのですが…
0199デフォルトの名無しさん2012/05/28(月) 14:11:36.99
>>196
すみません。>>197 さんが書いてる通りです。

>>195
while($html =~ s/<div id="hoge">(.+?)><\/div>//is){ 〜 }
このように、正規表現で必要なところを抜き取るためだけに使用してます。
0200デフォルトの名無しさん2012/05/28(月) 14:14:38.11
>>198
OS 起動
URL Snooper2 を起動
スクリプトを走らせる
といった最小限の行動でも、うちでは URL Snooper が検知しました。

人様に渡す予定のあるものなので、「他の URL にアクセスしてるんだけど」
といったことを言われないようにしたいので、今回 URL Snooper2 で調べたら
他の URL もアクセスしてたので気になって質問させて貰っている次第です。
0201デフォルトの名無しさん2012/05/28(月) 14:47:14.55
細かいけど、$res->decodec_content(...)は$res->decoded_content(...)だな。
同じくイメージファイルにアクセスは無かった。Wiresharkで確認。
0202デフォルトの名無しさん2012/05/28(月) 14:59:23.78
URL Snooper が取得したコンテンツの URL に反応してるだけなんですかねぇ。
ん〜

>>201 さんが使ってる TCP/IP Snoop のソフトが反応してないだけだし、
問題無さそうですね。


ありがとうございました。
0203デフォルトの名無しさん2012/05/28(月) 21:46:42.93
LWPによるアクセスも、アフィリのリンク先にアクセスした場合カウントされると思いますか?
UAやリファラの偽装は前提とします。
0204デフォルトの名無しさん2012/05/28(月) 23:44:18.10
10年前ならともかく今は無理。
単発ならWWW::Mechanizeでいけるかもね。
0205デフォルトの名無しさん2012/05/29(火) 01:16:39.84
>>204
ありがとうございます。さすがに・・ですよね。

プロキシのリストとりつつアクセスしていくみたいなのありかなと思ったので・・
もちろん締め出しこわいので実際にはやりませんが
0206デフォルトの名無しさん2012/05/31(木) 00:01:00.45
バイナリファイル内から、特定の数バイトが存在する場所を
探すプログラムを書いているんですが、最終的な検索がうまく
いきません。

ファイルをopenして、一定の長さのデータを読み込んでから、
unpack()で16進文字列(?)に変換して、index()で検索している
のですが、テスト用のデータで確かに検索対象の16進文字列
があるはずなのに、index()の戻り値が-1になってしまいます。

my $seach = "ffffffffff";
read(IN,$buf,$size);
my $data = unpack("H*",$buf);
my $pos = index($data,$search);

みたいな感じで、$data内には"ffffffffff"が見えるのですが、
$pos=-1で戻されてしまいます。

unpackで変換した$dataは文字列として解釈されてないので
しょうか?
0207デフォルトの名無しさん2012/05/31(木) 02:11:31.61
binmode してないだけとか・・・
0208デフォルトの名無しさん2012/05/31(木) 07:28:45.00
>>207
若干省きましたが、binmodeにはなってます。
0209デフォルトの名無しさん2012/05/31(木) 08:09:51.00
openやreadにエラートラップを付けて、ファイルを読めてるかを確認。
次に$dataの中身を目で確認。
0210デフォルトの名無しさん2012/05/31(木) 08:28:51.99
>>209
そのへんもデバッガモードで動かしてみましたが、
問題ないようでした。

$dataも16進文字列(と思われるもの)がずらっと
並んでいるのを確認できます。

見た目、p $dataした中に"ffffffffff"が見えて
るのですが、次のステップに進むと$pos=-1で
返されていて、???という状態です。

当初、いくつかのサイトで$searchのほうをpack
したり、"\xff\xff\xff…"みたいな書き方でバイ
ナリのままindex()で検索するサンプルコードを
見つけたので、それを基に作っていたのですが、
どうしてもヒットしないので、読み出したデータ
のほうを文字列化してから検索すれば問題なかろ
うと思って、前のコードにしてみましたが、結局
あまり状況に変化がありませんでした。

ちなみに、変数に直接16進数でバイナリを突っ込
みたい場合は、↑に書いたように1バイトごとに
分けてから、\xを付加して代入でいいんですよね?
0211デフォルトの名無しさん2012/05/31(木) 08:36:29.21
>>208
「若干省きましたが」
0212デフォルトの名無しさん2012/05/31(木) 09:42:06.29
>>210
my $search = "ffffffffff";
my $buf = "\x20\x20\x20\xff\xff\xff\xff\xff\x20\x20";
my $data = unpack("H*", $buf);
my $pos = index($data, $search);
print $pos;

実験してみて、6が出るか確認。
出ればreadか、省いた部分に問題がある。
0213デフォルトの名無しさん2012/05/31(木) 14:46:24.22
>>212
ちゃんと6と出ました…

いろいろ試行錯誤した結果、
>省いた部分に問題がある。
がビンゴのようです、、、orz.

実際検索するバイト列の$searchは、複数設定したかったので、
冒頭で別のテキストファイルを読み込んで配列にいれていたの
ですが、ここがガンだということがわかりました。

my $list = shift;
open(IN, $list);
my @search = <IN>;
close(IN);

というような感じで、>>206の"my $pos = index($data,$search);"
を@searchの個数分だけ回していたのですが、これを入れるとダメ
になります。上記のファイルオープンを無くして、

my $search = shift;

にして、検索文字列の個数分ループを外したら、とたんに検索
がヒットするようになりました。

リストファイルは普通に16進数文字列が数行書いてあるだけの
テキストファイルなのですが、何か文字コードや改行関係で
最初のリスト読み込みのコードだと問題あるのでしょうか?

perlが動いているマシンはlinux(EUC)で、テキストファイルは
たしかにwindowsでも触った覚えはあるのですが、デバッガモード
で$search[x]で見る分には、普通の文字列に見えていたのですが…?
0214デフォルトの名無しさん2012/05/31(木) 15:14:31.87
最初っから全部あげてりゃ
15時間もムダにならなかった、
せいぜい1時間くらいで解決できた
こうやってデスマーーーーーーーーーーーーーーーーーーーーーーチが生まれる

一番のガンはお前だ
0215デフォルトの名無しさん2012/05/31(木) 15:45:40.14
おっちゃんの若いころはfreebsd-jp-mlで鍛え上げられたもんだ。
0216デフォルトの名無しさん2012/05/31(木) 16:03:51.82
>>213
chompを忘れてるとエスパーしてみる。
0217デフォルトの名無しさん2012/05/31(木) 19:22:05.98
>>214
サーセン <(_ _)>

>>216
多分、ビンゴっぽいのですが、若干修正してもまだ動かないので、知恵を貸して下さい。

サンプルと助言をいろいろつぎはぎして、↓のようなコードになりましたが、相変わらずこれだと検索できません…
0218デフォルトの名無しさん2012/05/31(木) 19:22:23.35
my $list = shift;
open(IN, $list) || die 'cant open list file';
chomp(my @search=<IN>);
close(IN);
my $BUFFER_SIZE = 1024 * 4;
foreach my $file (@ARGV){
if(! -f $file){ next; }
print "$file\n";
open my $FH, "<", $file || die 'cant open file';
binmode($FH);
my $buf;
my $data;
my $totalread = 0;
my $readlength = 0;
while($readlength = read($FH, $buf, $BUFFER_SIZE)){
foreach (@search){
my $data = pack("H*", $_);
my $pos = -1;
while( 1 ){
$pos = index($buf, $data, $pos + 1);
last if $pos == -1;
printf("\toffset:%x", $totalread + $pos);
print " -> ", unpack("H*", $data), "\n";
}
}
$totalread += $BUFFER_SIZE;
}
close $FH;
}
0219デフォルトの名無しさん2012/05/31(木) 19:23:22.46
>>213で書いたように、最初の引数をリストファイルにせず、
検索文字列を1個だけとって、@searchのループをしないように
するときっちり検索できるのですが…

・diff結果
5,9c5
< my $list = shift;
< open(IN, $list) || die 'cant open list file';
< chomp(my @search=<IN>);
< close(IN);
<
---
> my $search = shift;
24c20
< foreach (@search){
---
> #foreach (@search){
26c22
< my $data = pack("H*", $_);
---
> my $data = pack("H*", $search);
35c31
< }
---
> #}

まだ、文字列の取り扱いをミスっているのでしょうか?
0220デフォルトの名無しさん2012/05/31(木) 20:03:37.39
ファイルはCRLFでchompしてもLFしか取れてないとか
0221デフォルトの名無しさん2012/05/31(木) 20:15:35.57
あるクラスのすべてのインスタンスから
いじれるような変数を生成するためには
どこにどのように宣言したらよいでしょうか?
0222デフォルトの名無しさん2012/05/31(木) 20:22:00.39
chompでハマったことあったなぁ
chompの代わりにこれつかうといいよgはなくてもいい
$line =~ s/\x0D?\x0A?$//g;
0223デフォルトの名無しさん2012/05/31(木) 20:28:58.09
>>221
package Foo;
my $shared;
sub shared_var {
if (@_) { $shared = $_[0]; }
$shared;
}
0224デフォルトの名無しさん2012/05/31(木) 20:35:01.45
>>223

ありがたや!
この場合のmy $shared;
てゆうのはどのタイミングで宣言されるの?

要は、最初だけ初期化して
あとはインスタンスのやつらがその変数をいじりたおすってこと
したいんだけど。
0225デフォルトの名無しさん2012/05/31(木) 20:59:19.46
グローバルなら our の方が好き
0226デフォルトの名無しさん2012/05/31(木) 21:08:23.63
>>224
コードが読み込まれて実行される時。
あれが Foo.pm に書かれてて他のファイルから use Foo とかするならその時。
サブルーチン Foo::shared_var がいつ定義されるかってのと同じ。

カプセル化が必要なければもちろん our でよし。
0227デフォルトの名無しさん2012/05/31(木) 22:34:34.17
>>220
>>222
リストファイルのほうをod -tx1してみたら、見事に0d0aが
入ってました、、、orz.

日頃はshellとawkばっかりなので、改行の扱いとかルーズ
でしたが、こんなにハマるものとは…

結局、リストの読み込み部分を、>>220さんの指示通り、
my @search;
my $list = shift;
open (IN, $list) || die 'cant open list file';
while(<IN>){
s/\x0D?\x0A$//g;
push(@search, $_);
}
close(IN);

とすることで、無事に複数の文字列を検索させることが
できました。

ありがとうございました〜
02282272012/05/31(木) 22:51:12.56
あ、>>222さんのサンプル通りでした、スマソ
0229デフォルトの名無しさん2012/05/31(木) 22:57:34.67
結局改行か
0230デフォルトの名無しさん2012/05/31(木) 23:33:11.84
Perlでページをリロードした際、一部のテンプレートな出力だけ再読み込みしないで
表示したままにすることはできますでしょうか?

いったん画面が白くなるより、なにか見せてたほうがユーザがストレスに
感じないように思うんです。

prototype.jsとかのお話になってしまったら恐縮です。
0231デフォルトの名無しさん2012/06/01(金) 00:02:55.88
CGI についての質問は板違いです。WEB プログラミング板でどうぞ。
CGI と Perl の区別がつかない人も WEB プログラミング板に行ってください。
0232デフォルトの名無しさん2012/06/01(金) 07:57:10.65
>>230
つ[javascript]
0233デフォルトの名無しさん2012/06/01(金) 11:50:56.28
めんどくさいなら iframe w
0234デフォルトの名無しさん2012/06/01(金) 12:11:13.19
>>232
ありがとうございます。やはりjavascriptでやるしかないですか・・・

>>233
それでいいかもと思うようにちょっとなりましたw
0235デフォルトの名無しさん2012/06/02(土) 08:49:50.70
文字列内のAタグ内に「.jpg」と末尾についたURLを置換しようとすると
「.jpg」が末尾にないものは消去されてしまいます
解決策教えて下さい



$s = "<a href=\"url\" target=\"_blank\">url</a><a href=\"http://foo.jpg\" target=\"_blank\">foo</a><a href=\"http://bar.jpg\" target=\"_blank\">bar</a>";
$s =~ s/<a href="(.*?)\.jpg"/<a href=\"replace\"/g;
print "$s\n";


"<a href=\"url\" target=\"_blank\">url</a>"
↑この部分なくなる
</a>まで消えるんですが一体どういうカラクリで・・・?
0236デフォルトの名無しさん2012/06/02(土) 09:20:28.94
これもうテンプレ入れろよ

.*?がどこにマッチしてるかを考えろ
0237デフォルトの名無しさん2012/06/02(土) 09:58:32.41
俺の股間にマッチしてるぜ!
0238デフォルトの名無しさん2012/06/02(土) 10:04:56.28
>>235
use v5.14;
my $s = q{<a href="url" target="_blank">url</a><a href="http://foo.jpg" target="_blank">foo</a><a href="http://bar.jpg" target="_blank">bar</a>};
say $s =~ s/<a href="(.*?)\.jpg"/<a href="replace"/gr;
say $s =~ s/<a href="([^"]*)\.jpg"/<a href="replace"/gr;
⇒
<a href="replace" target="_blank">foo</a><a href="replace" target="_blank">bar</a>
<a href="url" target="_blank">url</a><a href="replace" target="_blank">foo</a><a href="replace" target="_blank">bar</a>

問題が発生した原因は、「(.*?)」が「.jpg"」が出てくるまで全部マッチしたためですね

>>236
落ち着け
0239デフォルトの名無しさん2012/06/02(土) 10:38:14.80
この手のヤツはもう全部パーサつかって
バラバラに分解したほうが早いんじゃあないかな

web::scraperとか
firefoxいれてるならfirebugも併用するとか
0240デフォルトの名無しさん2012/06/03(日) 21:49:44.05
forでループ処理をしているのですが、
ループの回数が増えるほどメモリを喰って処理が遅くなっていきます。
それぞれの変数が確保してるメモリの量を見る方法はないでしょうか?
0241デフォルトの名無しさん2012/06/03(日) 22:25:46.21
複数の改行をひとつの<br>にするにはどうすればいいのでしょうか?
$hoge =~ s/\n*/<br>/g;
ではできませんでした。
0242デフォルトの名無しさん2012/06/03(日) 22:44:37.72
$hoge =~ s/(\x0D\x0A|\x0D|\x0A)+/<br \/>/g;
0243デフォルトの名無しさん2012/06/03(日) 22:45:08.52
>>241
1)改行が「\r\n」だと無意味
2)てか\n*だと全文字の間に<br>が入っちゃうよ?

てことで
$hoge =~ s/(\r?\n)+/<br>/g;
でどう?
02442432012/06/03(日) 22:46:49.17
>>242さんの見てちょっと直してみた
$hoge =~ s/(\r?\n|\r)+/<br>/g;
0245デフォルトの名無しさん2012/06/03(日) 22:48:58.11
ちょっとまて。

複数の改行とは書いてあるが
複数の連続する改行とは書いてないぞ。
0246デフォルトの名無しさん2012/06/03(日) 22:53:56.52
s/\n+/<br>/mg;
02472412012/06/03(日) 23:26:42.09
ありがとうございました!
無事できました!
02482452012/06/04(月) 00:15:13.24
どういたしまして。
02492402012/06/04(月) 00:18:02.48
事故解決
Devel::Sizeでできました。
02502452012/06/04(月) 00:22:25.53
どういたしまして。
0251デフォルトの名無しさん2012/06/04(月) 04:18:44.32
5.10から\Rも使えるよー
0252デフォルトの名無しさん2012/06/04(月) 05:51:32.77
>>245
相当悔しかったようだが、そのタイミングではもう無理
■ このスレッドは過去ログ倉庫に格納されています