Perlコーディング初心者質問スレ Part 63
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2011/09/09(金) 18:11:49.71ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >>2 以降
前スレ http://hibari.2ch.net/test/read.cgi/php/1295170172/
0405nobodyさん
2012/01/02(月) 09:19:16.84ID:???0406nobodyさん
2012/01/03(火) 02:35:21.75ID:???0407nobodyさん
2012/01/03(火) 08:07:23.54ID:???0409nobodyさん
2012/01/03(火) 08:59:10.49ID:???0410nobodyさん
2012/01/03(火) 11:26:01.27ID:???0411nobodyさん
2012/01/03(火) 11:59:37.15ID:???0412nobodyさん
2012/01/04(水) 19:27:09.19ID:???私が欲しい情報はJavaScriptにより出力されたものであるために、
単純にPerlを用いただけでは難しいと分かりました。
どのように対処すれば、JavaScriptの表示部分を取得できるのでしょうか?
よろしくお願いいたします。
0413nobodyさん
2012/01/04(水) 22:01:40.66ID:???0414nobodyさん
2012/01/05(木) 01:03:58.26ID:???0415nobodyさん
2012/01/05(木) 01:39:51.36ID:???それで見張ればいい。
firefox 入れなくない!っていうなら snooper で見ればいい。
0416nobodyさん
2012/01/05(木) 22:01:42.38ID:???みなさんIDEは何をお使いですか?
今んとこ慣れないEclipseでやろうと
思ってます。
0417nobodyさん
2012/01/05(木) 22:27:56.90ID:???コード補完もリファクタリングもヘルプも
中途半端にしかならないからIDEは重いだけだよ。
0418nobodyさん
2012/01/05(木) 22:34:01.35ID:???最近はブロックの折り畳みとかあるんで、充分強力
0419nobodyさん
2012/01/05(木) 22:54:26.32ID:???効果が薄いようですね。
腹くくってエディタでやります。
0420nobodyさん
2012/01/06(金) 02:05:15.33ID:???モジュール ( .pm) を作ったときって、何かエラーが合った場合に
die でスクリプトを止めてしまってエラーを通知するべきか、
それとも STDERR にエラーを出力しつつスクリプトは止めないようにするべきか、
どちらがオススメのコーディングの仕方なんでしょう?
0421nobodyさん
2012/01/06(金) 02:11:20.73ID:???0423nobodyさん
2012/01/07(土) 06:25:16.35ID:???croak が分からなかったので調べてみた。
呼び出し元が分かる die か。なるほど。
ワーニングには carp か。
ありがとう!
>>422
根本的に文章が読みとれてないですよ。
0425nobodyさん
2012/01/07(土) 13:19:20.03ID:???422が正解だと思うが。
0426nobodyさん
2012/01/12(木) 05:19:37.52ID:???420は場合によりけりということがわかった上で、基本的なスタンスはどっちがいいか聞いてんじゃないの?
俺はプロセス殺すなー
変な値入ってんのに処理続けても意味ないし
warnなんてデバッグでしか使ったことないや
0427nobodyさん
2012/01/12(木) 12:02:21.96ID:???おまえも読解能力の欠陥持ちか。
「場合によりけり」では結局何も答えてないに等しいが、>>422はそんなこと書いてないだろ。
どういう時にどっちを選択すればいいかが簡潔に書いてあるだろ。
0428nobodyさん
2012/01/14(土) 02:03:55.49ID:???2038年1月19日3時14分7秒以降のUNIX時間を取得してみるよりスマートな方法で。
学校の宿題でカレンダーを作ったら2038年2月でずれちゃいました。
0429nobodyさん
2012/01/14(土) 05:41:58.49ID:???日付がどうなってるか確かめればよい
0430nobodyさん
2012/01/14(土) 10:28:47.22ID:???これで充分スマートじゃないか?
0431nobodyさん
2012/01/14(土) 12:11:45.71ID:???本当に知りたいことは、2038年1月19日3時14分7秒以降が扱えるかだろう? (キリッ)
0432nobodyさん
2012/01/14(土) 12:21:34.67ID:???0433nobodyさん
2012/01/14(土) 15:29:38.07ID:???年が4桁で有限なのと同じでしょ。
0434nobodyさん
2012/01/14(土) 15:46:35.43ID:???・Time::y2038 モジュールを使う
・DateTime モジュールを使う
のどれかで解決
0435nobodyさん
2012/01/14(土) 16:24:02.91ID:???"トレーニング" である宿題ではそうすべきではない。むしろ
time_t にさえ依存せず、自力で10桁年カレンダーのような無駄
なものを作って自分自身の糧とすべし。
0437nobodyさん
2012/01/14(土) 18:26:43.69ID:???自分で考えろ。こんな所聞くな。
他の人の労力で解決すんな。
0438nobodyさん
2012/01/14(土) 21:36:35.23ID:???既存モジュールの中身を読んでくれ。
0439nobodyさん
2012/01/14(土) 23:37:55.97ID:???0440nobodyさん
2012/01/15(日) 20:18:01.72ID:???0441nobodyさん
2012/01/15(日) 20:45:40.76ID:???0442nobodyさん
2012/01/18(水) 21:06:05.29ID:???元ファイル aaa.txt
変換プログラム trans.cgi
変換後のファイル bbb.txt
aaa.txt に書いてある「あ$kanaお」を読み込んで
trans.cgi にて$kana = きくけ; として変換し
bbb.txt に「あきくけお」で出力するには、どうしたらいいのでしょうか。
open関数で +< という読み書きでファイルを開いても
空テキストが作成されるだけで、うまくいきません。
どうかよろしくおねがいします。
0443nobodyさん
2012/01/18(水) 21:27:56.62ID:???open(my $outfh, ?>:utf8?, ?output.txt?);
while(my $line = <$infh>){
〜処理〜
print $outfh $line;
}
close($outfh);
close($infh);
0444nobodyさん
2012/01/18(水) 22:19:08.77ID:???http://perldoc.jp/docs/perl/5.10.1/perlfaq5.pod
my %var = (FOO => 'bar');
open my $fh, '+<', $file or die $!;
read $fh => my $text, -s $fh;
$text =~ s/__([A-Z]+)__/$var{$1}/g;
seek $fh, 0, 0;
print $fh $text;
truncate $fh, tell;
close $fh;
open my $sfh, '<', $src_file or die $!;
open my $tfh, '>', $tmp_file or die $!;
while (<$sfh>) {
s/__([A-Z]+)__/$var{$1}/g;
print $tfh $_;
}
close $tfh and close $sfh or die $!;
rename $tmp_file => $src_file or die $!;
0446nobodyさん
2012/01/25(水) 02:08:42.13ID:8GsK3GVUコマンドラインから、
echo "test.txt" | xargs perl -pi -e 's/hoge/HAGE/g'
とすると正しく置換されるのですが、
ブラウザからapacheをとおして、スクリプト内で上記のコマンドを、
`echo "[フルパス]test.txt" | xargs perl -pi -e 's/hoge/HAGE/g'`
や
system "echo ¥"[フルパス]test.txt¥" | xargs perl -pi -e 's/hoge/HAGE/g'"
とするとうまく置換されないのはなぜでしょうか?
またこのケースですとスクリプト内での記述はどのようにするのが適切でしょうか?宜しくお願い致します。
0447nobodyさん
2012/01/25(水) 03:35:55.61ID:???そのユーザ権限でファイルや当該ディレクトリは書き込み可能になっているか
をまずチェック。
0448nobodyさん
2012/01/25(水) 03:57:31.07ID:Arlh9fb/お返事ありがとうございます。ディレクトリとファイルは権限777にして試してみたのですが、
置換されませんでした。あとスクリプト中の文字のエスケープ漏れもみなおしてみたのですが、
結果変わらずでした。さらに調べてみます。ありがとうございます。
0449nobodyさん
2012/01/25(水) 04:06:26.93ID:???エラーは出てないのか
端末でスクリプトを走らせたらどうなるか
0450nobodyさん
2012/01/25(水) 08:23:33.82ID:???0451nobodyさん
2012/01/28(土) 22:01:51.13ID:???sendmailのログでしたorz←
0452nobodyさん
2012/01/29(日) 11:48:32.08ID:???0453nobodyさん
2012/01/31(火) 17:42:02.72ID:???&sub1(qq(asdasdqwdasdasd));
sub sub1
{
while($_[0] =~ /asd/gs )#←@
{
print $_[0];#←@でマッチした中身を出力したいが、subの引数
}
}
こんな感じのプログラムを作ったのですが
$_[0]の中身が更新できなくて困っています・・・
どなたか回避する方法を教えてください!お願いします
0454nobodyさん
2012/01/31(火) 17:56:37.52ID:???↓
/(asd)/gs
あとついでに書き直した。
sub1(qq(asdasdqwdasdasd));
sub sub1{
my $str = shift || '';
while($str =~ /(asd)/gs){
print $1;
}
}
慣れてくれば良いけど、初心者であるうちは $_ をそのまま使わずに関数内で変数を用意して
そこへ格納したほうがいいよ。
0457nobodyさん
2012/01/31(火) 18:52:11.00ID:???0458nobodyさん
2012/01/31(火) 21:02:02.01ID:???auの端末で検索できるものとできない機種があります。
同じ2009年にでたモデルでもできるできないがあります。
例えばCA002はできるけど、K002はだめ。
できないものは、何も検索フォームに入れないで検索してもダメです。
Jcode.pl 2.13でエンコードしてますが、
これが悪いのでしょうか?
どうしたら、文字検索をできるようにできますか?
0459nobodyさん
2012/01/31(火) 21:33:09.50ID:???携帯サイトのWebプログラムを語ろう Part3
http://kohada.2ch.net/test/read.cgi/php/1232544986/
0460nobodyさん
2012/01/31(火) 22:38:52.20ID:???端末が送ってきてる文字コードは本当に希望したものか
0462nobodyさん
2012/01/31(火) 22:57:27.90ID:???0463nobodyさん
2012/01/31(火) 23:06:58.71ID:???初心者スレだしねミ☆
0465nobodyさん
2012/02/01(水) 00:41:51.19ID:???他からデータを持ってきたりとかしない場合には utf-8 で問題無い。
0466nobodyさん
2012/02/01(水) 01:42:35.88ID:???0467nobodyさん
2012/02/01(水) 04:46:09.17ID:???0469nobodyさん
2012/02/01(水) 23:55:30.88ID:???0470nobodyさん
2012/02/03(金) 01:56:38.79ID:???0471nobodyさん
2012/02/03(金) 02:11:46.79ID:???0472nobodyさん
2012/02/04(土) 02:53:54.65ID:???header('Location') で調べれば良いと思ったものの、リダイレクトされた後には Location ヘッダは無く、
max_redirect(0) でリダイレクトさせなければ Location ヘッダを取得できて、リダイレクト先を知ることは出来ました。
max_redirect(0) でアクセスして、Location ヘッダがあれば max_redirect(1) とかにしてアクセス。
リダイレクトが1回で済まなければ max_redirect(2) でアクセスしてみる。
と言ったことをやってるのですが、これが非常に面倒なので結果的にアクセスした URL が取得できればと考えて質問させていただきました。
0473nobodyさん
2012/02/04(土) 03:45:11.91ID:???response_done ハンドラか response_redirect ハンドラに URL を記録する処理を追加する。
http://search.cpan.org/dist/libwww-perl/lib/LWP/UserAgent.pm#Handlers
0474nobodyさん
2012/02/04(土) 09:09:19.56ID:???HTTP::Response オブジェクトは使われた HTTP::Request オブジェクトを丸々保持してるし、
リダイレクト前の Response も previous メソッドでたどれる。
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
my $res = $ua->get("http://t.co/hog7vmt5");
do { print $res->request->uri, "\n"; } while ($res = $res->previous);
__END__
http://www.asahi.com/national/update/0204/TKY201202030789.html
http://t.asahi.com/5gxs
http://t.co/hog7vmt5
0475473
2012/02/04(土) 09:40:24.08ID:???成程、そっちをみれば良かったのか。勉強になったよ。
use LWP::UserAgent;
my $r = LWP::UserAgent->new->get('http://t.co/hog7vmt5');
print map $_->request->uri . "\n", $r->redirects, $r;
__END__
http://t.co/hog7vmt5
http://t.asahi.com/5gxs
http://www.asahi.com/national/update/0204/TKY201202030789.html
0476nobodyさん
2012/02/04(土) 16:24:03.95ID:???自分には >>474 さんの書き方がしっくりきたので、
これでいこうと思います。
ありがとうございました。
どうでもいい事だけど・・・
do{ }while( ) ってあまり好きじゃないw
ループの条件式が後に来るってーのが、なんか馴染めない (^-^;
0477nobodyさん
2012/02/05(日) 04:49:54.12ID:???> do{ }while( ) ってあまり好きじゃないw
> ループの条件式が後に来るってーのが、なんか馴染めない (^-^;
その方が都合のいいケースもたまにあるでしょ。
最低1回は処理が必要、って時が。たまにね。
0478474
2012/02/05(日) 10:00:34.05ID:???特にブロックの中身が複数行のときは最後の while を見るまでループだってことがわからんのが痛い。
あとまあ、動作も実際気持ち悪い。本物のループブロックじゃないから next とか使えんし。
まともに書く時はちょっと記述増えることになっても普通の while と last とかを組み合わせるほうがいい。
0479nobodyさん
2012/02/06(月) 18:29:54.91ID:ryr2jQRgPerl でアクセスしたいサイトがあるのですが、Perlからhtmlを読むことが出来ません。
IE8の「ソースを表示」では表示できるのですが。
アクセスしたいサイト :http://cinema.pia.co.jp/
Perlのスクリプトの場所 :http://x68000.q-e-d.net/~68user/net/sample/http-client-2.pl
その説明 : http://x68000.q-e-d.net/~68user/net/http-3.html
【実行結果】
perl http-client-2.pl -GET http://cinema.pia.co.jp/
HTTP/1.1 200 OK
Date: Mon, 06 Feb 2012 09:25:43 GMT
Server: Apache
Last-Modified: Fri, 28 Aug 2009 06:41:24 GMT
ETag: "304a0-2-f9082d00"
Accept-Ranges: bytes
Content-Length: 2
Connection: close
Content-Type: text/html
1
で終わってしまい、肝心のHTMLのBODYの部分を表示する事が出来ません。
どなたか分かる方教えてください。
0480nobodyさん
2012/02/06(月) 20:02:58.69ID:???0482nobodyさん
2012/02/06(月) 22:10:48.93ID:???0483nobodyさん
2012/02/06(月) 22:53:24.14ID:???覚えるともう、病みつきです。ftpもこれでやってます。
sendmailだって大丈夫です。
0484479
2012/02/07(火) 01:13:45.57ID:eo0HNsOB>>480 >>481
LWP 使ってみました。http://www.sea-bird.org/doc/Solaris8/Perl_4.html
出来ました
>>482
wget をPerlから?使う方法が分かりませんでした。コマンドとして使うという事なら目的と違います
>>483
上記チュートリアルサイトにて telnet も試しましたが、駄目でした
実は本当にやりたいことは別にあったので、すみませんが質問をやり直させてください
このサイトは、映画レビューサイトなのですが、
http://cinema.pia.co.jp/user/xxxxx/imp/all/ (xxxxxは数字)
にて、各ユーザーのレビュー一覧を見る事が出来ます
(実は自分のレビューを抽出したいだけです)
しかし、Perlからのアクセスでは、LWPを使ってもここではじかれてしまいます
(IE8の「表示→ソース」では見れるが、Perlにprintさせると違うものになっている)
どなたか原因分かりますでしょうか?
0485nobodyさん
2012/02/07(火) 01:25:44.20ID:???0486nobodyさん
2012/02/07(火) 01:48:21.80ID:???use LWP::UserAgent;
use HTTP:Request::Common;
my $ua = LWP::UserAnget->new();
$ua->agent('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E)');
my $req = GET('http://cinema.pia.co.jp/user/xxxxx/imp/all/');
my $res = $ua->request($req);
if(open(my $outfh, '>', 'debug.html')){
print $outfh $res->content() || '';
close($outfh);
}
0487479
2012/02/07(火) 03:24:39.22ID:???>>485 駄目でした。ソースの190行目辺りからが違ってきます
上手くいく時は、以下のようになります。良く分かりませんが。
<div id="mainImpMain">
<form method="get" class="common">
<ul class="pagedLink">
>>486
出来ました。ありがとうございました。
0489nobodyさん
2012/02/08(水) 00:00:54.11ID:???自分自身が呼ばれて起動された際の HTTP ヘッダってどうやって確認するのでしょうか?
use CGI の header はヘッダを出力するためのものっぽいし・・・
0490nobodyさん
2012/02/08(水) 00:27:39.96ID:???それはあんたのスクリプトがどうやって呼び出されているかによる。
httpd に Apache を使ってて CGI 経由で呼び出されているなら
Apache のマニュアルと CGI の仕様書を読んでくれ。
http://httpd.apache.org/docs/
http://www.studyinghttp.net/rfc_ja/rfc3875
あと HTTP の仕組みもきちんと理解してくれ。
http://www.studyinghttp.net/rfc_ja/rfc2616
0491nobodyさん
2012/02/08(水) 00:51:03.57ID:???自身のスクリプトが呼ばれた際の HTTP ヘッダを得る方法を伺っているわけでして・・・
0493nobodyさん
2012/02/08(水) 04:36:08.44ID:???↑
最近の若い奴は、物事の尋ね方も知らないのか?ブツクサブツクサ
0494nobodyさん
2012/02/08(水) 07:53:34.31ID:D9+63/xk抜粋するようなプログラムを作成したいと思います。
例えば、次のような文章があった場合、
------------------------------------
ほげほげふがふが
http://example.com/hogehoge1
ほげほげふがふが
http://example.com/satitama1/saitama.html
<!-- link -->
リンク一覧
〜テスト〜 http://example.com/hogehoge2/test.hmtl
〜さいたま〜 http://example.com/satitama2
東京
<!-- /link -->
------------------------------------
結果は
------------------------------------
<a href="http://example.com/hogehoge2/test.hmtl">テスト</a>
<a href="http://example.com/satitama2">さいたま</a>
------------------------------------
のようにしたいのですが、どのように書いたらよいでしょうか?
尚、URLを抜き出す正規表現は次のように書きました。
(https?|ftp)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)
環境は、CentOS5 perl5.10です
0495nobodyさん
2012/02/08(水) 10:31:20.53ID:???http://perldoc.jp/docs/perl/5.10.1/perlfaq6.pod#How32can32I32pull32out32lines32between32two32patterns32that32are32themselves32on32different32lines63
my $protocol = qr/(?:https?|ftp)/;
my $format = '<a href="%2$s">%1$s</a>' . "\n";
my $text = do { ... };
my @link;
while ($text =~ m{<!-- link -->(.*?)<!-- /link -->}gs) {
my $links = $1;
push @link, sprintf $format, $1, $2
while $links =~ m{〜(.*?)〜.*?($protocol://[!#-;=?-\[\]_a-z~]+)}gos;
}
print @link;
0498nobodyさん
2012/02/19(日) 12:41:02.48ID:???下着は、妻と娘のお下がりです。
おまけに洋式トイレ、便座が上がってるとか、飛沫が飛んでるとか、いちいち五月蝿いんです。
おかげで、トイレは座ってするように強要され、もうブリーフの前、開ける必要が無いんだからと、私達のお下がりで十分でしょう。と、ここ何年も私の物は買ってくれません。
今では開き直って、ブラジャーもしています。
家に居る時は、娘のスカートを穿き、外出は娘のパンツ、ジーンズ穿いていきます。
娘は、始めは困惑していたが今では慣れ、何でも貸してくれます。
妻の洋服、パンツ、スカートはウエストがちょっときつい。
ストレッチの物は、勝手に着ています。
0500nobodyさん
2012/02/19(日) 15:19:47.97ID:???0501nobodyさん
2012/02/19(日) 17:53:14.70ID:???0503nobodyさん
2012/02/20(月) 14:28:00.53ID:???my $family = Family->new();
$family->husband('>>498'); $family->wife('百合子(仮)'); $family->daughter('楓(仮)');
my $corp = Corp->new(); $corp->salaryCalculation();
$family->income($family->husband(), $corp->salary());
if($family->income($family->husband()) > 250000){
# トイレ
my $toto = Toilet->new();
$toto->type('EU'); # JA or EU
my $urine = $family->urine($family->husband()); # 小便をする
$toto->urine($urine);
if($toto->is_splash()){ $toto->forced_to_sit(1); } # トイレの用足しには座りを強制
# 下着
if($toto->forced_to_sit()){ $family->underwear($family->husband(), $family->underwear($family->wife()); }
# 他の着衣
if($family->underwear($family->husband()) eq $family->underwear($family->wife())){
$family->brassiere($family->husband(), $family->brassiere($family->wife());
$family->skirt($family->husband(), $family->skirt($family->daughter());
$family->jeans($family->husband(), $family->jeans($family->daughter());
}
}else{
$family->underwear($family->husband(), 'BOXER PANTS');
$family->brassiere($family->husband(), undef);
$family->skirt($family->husband(), undef);
$family->jeans($family->husband(), 'EDWIN');
}
>>498 じゃないけど、これが限界っす><
娘や妻への下着のセットは省いたw
0504nobodyさん
2012/02/20(月) 14:29:13.01ID:???■ このスレッドは過去ログ倉庫に格納されています