Perlコーディング初心者質問スレ Part 57
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2008/02/25(月) 19:25:51ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >2 以降
前スレ http://pc11.2ch.net/test/read.cgi/php/1189939783/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0612597
2008/05/28(水) 21:26:18ID:???こんな前処理してから、>>599のmap対象配列に、( 0..\$temp ) って感じかなぁ?
エレガントさには欠けるけど、これが可読性保つギリギリかな?
0613597
2008/05/28(水) 21:28:46ID:???0615599
2008/05/28(水) 22:23:24ID:???ああ、
@array1 = ( undef, undef ) ;
は考えてたけども、それは想定してなかったw
>>612の解で良いんじゃね? 助長を厭わないならば、
map{ 略 } 0 .. $#{$_[0]} , 0 .. $#_ - 1 ;
っつー荒技もw
自分のスクリプトじゃ絶対やんないけどね。
0617nobodyさん
2008/05/29(木) 03:05:45ID:???覚えると便利そうだけど。
0618nobodyさん
2008/05/29(木) 03:45:40ID:???違うっていえば、{}の中を、引数リストのそれぞれの要素で実行した結果をリストとして返すってとこか。
かなり便利な局面もある。覚えとくべきだとは思う。
@res = map{ $_ + 10 } (1,2,3,4,5) ;
print join("\n",@res);
---結果---
11
12
13
14
15
$_->[0] += 1900;
$_->[1]++;
@$_;
}[(localtime)[5,4,3,2,1]];
2008/05/28 07:02
って出るかと思う。
0620nobodyさん
2008/05/29(木) 08:23:18ID:???シュワルツ変換という定番sort手法には必須だよ。
ぐぐって、foreach 文で書いてみたらありがたみが分ると思う。
>>619
お前さんの例は頻繁にとんでもなく斜め上を行くなあw
なんで一要素しかないと分りきってる無名配列を作って map の例にする?
do ならいざしらず
perl -le 'my $Now_Date = sprintf qq|%04d/%02d/%02d %02d:%02d|, do{
@_ = (localtime )[5,4,3,2,1] ;
$_[0] += 1900 ;
$_[1] ++ ;
@_ } ;
print $Now_Date ;'
それ以前に普通は↑こんな面倒な事しないだろ?
perl -MPOSIX=strftime -le '$str =strftime "%Y/%m/%d %H:%M", localtime; print $str, "\n"; '
0621607
2008/05/29(木) 17:51:57ID:???IPアドレスのチェックを行いたいと思ってます。
ググると、以下の様な正規表現がありますが、
\d(バックスペース)の意味が分かりません。
どういう意味なんでしょうか?
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
0622nobodyさん
2008/05/29(木) 17:53:57ID:???0623607
2008/05/29(木) 17:54:42ID:???\dは数字でした。
申し訳ない
0624607
2008/05/29(木) 18:10:05ID:???正規表現で/をマッチさせたいのですが、
以下であってますでしょうか?
$hoge =~ /\//
0625607
2008/05/29(木) 18:11:58ID:???\/で、いけるみたいです。
お騒がせしました。
0626nobodyさん
2008/05/29(木) 18:15:31ID:???すこしは綺麗?
0627nobodyさん
2008/05/29(木) 18:19:11ID:???シュワルツ変換とかまだいまいち理解できないけど良さそうだね。
sortは結構使うから思い処理の部分で使うのはいいかも。
でも問題は後で読み直して何してるか理解できなくなりそうな所だな。
つっこみおおきに♪
mapを覚えちゃってからどんどん斜め上に逝っちゃいました。
ひとまず車輪の再発明は大好き♪
0629nobodyさん
2008/05/30(金) 02:09:30ID:???0630nobodyさん
2008/05/30(金) 08:17:40ID:???0631nobodyさん
2008/05/30(金) 10:14:07ID:???0632nobodyさん
2008/05/30(金) 10:19:32ID:???0633nobodyさん
2008/05/30(金) 11:57:18ID:???を書くとローカルで文字化けしてしまいます。これをコメントアウトすると
XREA.COMのサーバ上でScript Errorが発生してしまいます(しかもエラーログが見られない)。
ローカルでもXREA.COM上でも動くようにしたいのですがどうすればいいでしょうか。
コードはこんな感じです。
#!/usr/bin/perl
use strict;
use XML::DOM;
use encoding "utf8";
my $xhtml_file = $ENV{'PATH_TRANSLATED'};
my $parser = new XML::DOM::Parser;
my $doc;
eval { $doc = $parser->parsefile($xhtml_file) };
if($@) {
print "Content-Type: text/plain;charset=utf-8\n\n";
print "parsing error occured: $@";
exit;
}
# 広告挿入処理
print "Content-type: application/xhtml+xml;charset=utf-8\n\n";
print $doc->toString;
$doc->dispose;
ローカルの環境はUbuntu 8.04 + Perl 5.8.8 + Apache 2.2.8、
XREA.COMはよくわかりません。
0635nobodyさん
2008/05/30(金) 12:23:13ID:???utf8::is_utf8($doc->toString) ? print encode('utf-8', $doc->toString) : print $doc->toString;
とすればいいみたいです。utf8フラグというのが関係しているみたいなので、
調べてみます。おさわがせしました。
0637nobodyさん
2008/05/30(金) 12:50:11ID:???0638nobodyさん
2008/06/01(日) 07:19:24ID:???0639nobodyさん
2008/06/02(月) 12:34:35ID:???Last-Modified↑これをtimeの値に変換する方法を教えてください。
3600秒以内とかの判定に使いたいので。
0642nobodyさん
2008/06/02(月) 13:51:21ID:???$mon = 1 if $mon eq 'Jan';とか。
スマートな例があったら参考の為に見せてください。
sub last_modified {
my $time = shift;
my($day, $mon, $year, $hour, $min, $sec);
if ($time =~ /\w+, (\d+) (\w+) (\d+) (\d+):(\d+):(\d+) GMT/) {
($day, $mon, $year, $hour, $min, $sec) = ($1, $2, $3, $4, $5, $6);
$mon = 1 if $mon eq 'Jan';
$mon = 2 if $mon eq 'Feb';
$mon = 3 if $mon eq 'Mar';
$mon = 4 if $mon eq 'Apr';
$mon = 5 if $mon eq 'May';
$mon = 6 if $mon eq 'Jun';
$mon = 7 if $mon eq 'Jul';
$mon = 8 if $mon eq 'Aug';
$mon = 9 if $mon eq 'Sep';
$mon = 10 if $mon eq 'Oct';
$mon = 11 if $mon eq 'Nov';
$mon = 12 if $mon eq 'Dec';
} else {
die "Error: $time\n";
}
$time = timelocal($sec,$min,$hour,$day,$mon-1,$year);
return $time;
}
0643nobodyさん
2008/06/02(月) 14:47:28ID:???%mons = (
Jan => 1, Feb => 2, Mar => 3, Apr = 4, # ……以下省略
);
$mon = $mons{$mon};
とかどうよ?
0647nobodyさん
2008/06/02(月) 17:46:33ID:VCfcjQkNHTML::Template を使いたいのですが、
ローカルにインストールしている、
C:\Perl\cpan\build\HTML-Template-2.9\Template.pm
というファイルを、以下のcgiと同ディレクトリにコピーしました。
#!/usr/local/bin/perl
use strict;
use lib qw(.);
use HTML::Template;
print "Content-type:text/html\n\n", "test";
ですが、うまくいかないようです。
use lib qw(.); の部分を、
unshift @INC, '.';
などとしても不可能でした。
ググっても上記の方法ぐらいしか出てこないんですが、何がいけないか教えていただけますでしょうか。
Perl のバージョンは 5.00503 です。
0648nobodyさん
2008/06/02(月) 17:51:49ID:???0649nobodyさん
2008/06/02(月) 18:08:23ID:VCfcjQkNありがとうございます。
助言どおりHTML ディレクトリにTemplate.pmを入れて、エラーが出たので、
Digest::MD5がどうだとかエラーが出ました。
同じ要領で、Digest ディレクトリを作り、MD5.pmを入れると、
次はXSLoader.pmが必要らしく、それもcgiと同ディレクトリに入れました。
次はDynaLoader.pmがどうとかエラーが出たので、それも同じディレクトリに入れたのですが、
今度はエラーが消えませんでした。。
最終的にCGI::Carpがはいたエラーは以下です。
[Mon Jun 2 18:01:45 2008] Template.pm:
[Mon Jun 2 18:01:45 2008] Template.pm:
[Mon Jun 2 18:01:45 2008] MD5.pm:
[Mon Jun 2 18:01:45 2008] MD5.pm:
[Mon Jun 2 18:01:45 2008] DynaLoader.pm: Can't locate loadable object for module Digest::MD5 in @INC
(@INC contains: /usr/lib/perl5/5.00503/i386-linux /usr/lib/perl5/5.00503 /usr/lib/perl5/site_perl/5.005/i386-linux /usr/lib/perl5/site_perl/5.005 .) at HTML/Template.pm line 915
[Mon Jun 2 18:01:45 2008] Template.pm:
[Mon Jun 2 18:01:45 2008] Template.pm: BEGIN failed--compilation aborted at HTML/Template.pm line 915. BEGIN failed--compilation aborted at test.cgi line 6.
0650nobodyさん
2008/06/02(月) 18:17:18ID:???0651nobodyさん
2008/06/02(月) 18:18:22ID:???0652nobodyさん
2008/06/02(月) 18:25:00ID:VCfcjQkN↑必要としているモジュールは違うものの、
この人と同じ状況なのかな、と思うんですがどう思いますか?
同じ状況だとすると、不可能ですよね
FTPであげることしかできませんので。。。
0653nobodyさん
2008/06/02(月) 18:41:40ID:???Linuxでコンパイルし直さないとムリ。よってムリ。
0654nobodyさん
2008/06/02(月) 18:45:29ID:VCfcjQkN5.00503で使えるHTML::Templateの代わりのようなものがほしいんですが、
どこを探せばいいでしょうか。
何度も申し訳ありません。
0655nobodyさん
2008/06/02(月) 18:52:18ID:VCfcjQkN0656nobodyさん
2008/06/02(月) 18:56:19ID:???自前でテンプレート化した方が早い。
スキン対応と銘打ってる配布CGIのソース読んだ方が早い気がする。
0657nobodyさん
2008/06/02(月) 18:59:25ID:???0658nobodyさん
2008/06/02(月) 19:03:56ID:???ってか、>>649の内容を見るに、DynaLorderでわなくて、Digest::MD5(.so)が無いんでないの?(これも標準でない?)
まあなければ、Digest::MD5はXSモジュール含んでるから、
そのサーバー上でコンパイルし直さないと実行できないのは、>>653と同じ意見だけど。
0659nobodyさん
2008/06/02(月) 19:07:00ID:VCfcjQkNテンプレート使えないとなると、めんどくさくなるけど、まぁがんばります。
ありがとうございました。
0660nobodyさん
2008/06/02(月) 19:49:04ID:???HTMLと最も親和性のある言語として、Perl/CGIが一世風靡しただろ。
0663nobodyさん
2008/06/03(火) 00:57:17ID:etSjPPZKプログラムを作ったのですが
HTMLのformでenctypeをmultipart/form-dataにすると
送られてくるデータの形式が変わってしまって
うまくハッシュに確保することができなくなっちゃいました。
送られてきたデータが
multipart/form-dataなのか
application/x-www-form-urlencodedなのか
調べる方法ってありますか?
ついでに、multipart/form-dataで送られてきたデータの扱い方を
まとめてあるサイトとかありましたら教えてほしいです。
0664nobodyさん
2008/06/03(火) 01:01:53ID:???multipart/form-data の処理は CGI.pm 使ってね♪
0665nobodyさん
2008/06/03(火) 01:12:56ID:???CGI.pm ならどちらの形式でも意識せず受け取れる。
http://perldoc.jp/docs/modules/CGI.pm-2.89/CGI.pod
自前実装したいのなら
http://www.studyinghttp.net/cgi-bin/rfc.cgi?3875#Sec8.2
http://www.asahi-net.or.jp/~sd5a-ucd/rec-html401j/interact/forms.html#h-17.13.4.1
http://www.studyinghttp.net/cgi-bin/rfc.cgi?2388
0666nobodyさん
2008/06/03(火) 01:24:31ID:etSjPPZKありがとう!
0667nobodyさん
2008/06/03(火) 01:58:53ID:???テンプレートエンジン、自分で作るという手もある。
そんなに難しくないよ。
Compositeパターンでも使えば。
0668nobodyさん
2008/06/03(火) 09:41:38ID:???HTML をふつうに書く
HTML なかに <%BODY%> とか、挿入場所を示す識別子をいくつか用意して書き込む
プログラムからテンプレート HTML を読み込む
正規表現で置換
たったこれだけです。
0669nobodyさん
2008/06/03(火) 11:07:04ID:???HTML::Templateは単純な処理だしね
さくっと使いたい時には便利、無けりゃ無いでどうにでもなる
0670nobodyさん
2008/06/03(火) 12:56:41ID:K4KbdDUTそのCGIですべてを管理するような仕組みを作った場合
やっぱindex.cgiにアクセスが集中してよくなかったりするんですか?
0671nobodyさん
2008/06/03(火) 13:31:41ID:???自分は普通のエディタ (関数へのジャンプとか無くて色分けだけ) なので
まったく違う処理はファイル分けてる
0672nobodyさん
2008/06/03(火) 17:01:51ID:???それぞれ頭で同じ事やってるから、all.cgi(index.cgi?)に全て
まとめられないか?って事じゃないのかな?
my $cgi = CGI->new();
my $config = init();
if( $cgi->param('mode')eq'hoge1' ) {
require 'hoge1.pl';
hoge1::main($config);
} elsif( $cgi->param('mode')eq'hoge2' ) {
require 'hoge2.pl';
hoge2::main($config);
…って、感じで。漏れも昔、初心者だった時に同じ事を思った。
答えは、当然all.cgi(index.cgi?)の呼び出しのオーバーヘッドは
全CGIの呼び出し回数倍増えるよ。
そういう事じゃなくて??
0673nobodyさん
2008/06/03(火) 17:44:51ID:???俺それやってる
wikiみたいに書けるテキストファイルを自動で携帯/PCに最適化してValid XHTML出力する、みたいな。
0674nobodyさん
2008/06/03(火) 17:56:29ID:???0675nobodyさん
2008/06/03(火) 19:41:27ID:???企画倒れというより、制作者が途中で飽きて、ブームになっても、そのまま放置……みたいな。
かのCPANだって、一部のモジュール以外は、姥捨山みたいになってる。
古いモジュールに、パッチ送ってもメール不達とか多すぎるんだよ!
0676nobodyさん
2008/06/03(火) 20:52:43ID:???ここの 東京の xml から加工を行っています。
最終的には明日の天気を出力したいのですが、以下のコードを書いたところ
気温や降水確率が出力されなくて悩んでいます。
================================================
use XML::TreePP;
use strict;
my $tpp = XML::TreePP->new();
my $tree = $tpp->parsefile( '13.xml' );
print $tree->{weatherforecast}->{pref}->{area}->[1]->{info}->[1]->{weather} , "\n";
print $tree->{weatherforecast}->{pref}->{area}->[1]->{info}->[1]->{temperature}->{range}->[1];
================================================
{range}->[1] で %hash と言われてしまうのはどうしてでしょうか。
その後に [1]->{-centigrade} をするとこの場合は min が出てくるのは判っています。
0677nobodyさん
2008/06/03(火) 21:13:48ID:???ダンプしろよ
0678nobodyさん
2008/06/03(火) 21:21:10ID:???manual嫁。
あと、XMLの中にareaやinfoやrangeの要素が1つしか無い場合に配列要素に
ならないのがTreePPの仕様なので、例えばinfoが1要素しか無い場合は
print $tree->{weatherforecast}{pref}{area}[1]{info}{temperature}{range}[1]{#text}
とアクセスしなくてはいけない。オプションで回避できるけど。
0679670
2008/06/03(火) 22:25:48ID:etSjPPZK>>673
ちょっと俺の勉強不足で言ってることがよくわからないけれど
例えばindex.cgi?page=homeだとhome.htmlをcgiプログラムが引っ張ってきて表示する
みたいな仕組みを作った場合、
どのユーザーがどのページを見てもindex.cgiに必ずアクセスするわけじゃない?
てことはページが1000ページとかできたとして
いろんな人がいろんなページを見出したらindex.cgiのアクセスが集中して
なんかまずいことになったりしないのかなって思ったの。
教えてLarry!!
0680nobodyさん
2008/06/03(火) 22:40:04ID:???0681670
2008/06/04(水) 00:28:11ID:KcodebuXあ、じゃあ余計な心配しなくて大丈夫かぁ
0682nobodyさん
2008/06/04(水) 01:09:20ID:???0683nobodyさん
2008/06/04(水) 05:38:01ID:???A:opendir でファイル一覧を取得する
B:予めファイル一覧をそれ用のメモファイルに書き出しておいてそれを読みこんで取得
AとBではどちらが負荷が少ないですか?
0684nobodyさん
2008/06/04(水) 06:05:53ID:???0686nobodyさん
2008/06/04(水) 10:13:14ID:???掲示板のタイトル一覧取得を現在作っています。
それでタイトルがもし長かった場合、最初の9byteだけを表示するようにしたいのですが・・・
if (length($title) > 9) { $get = substr($title[3],0,9); }
以上のようにしてしまうと、9byte目に全角文字が来た場合文字化けしてしまいます。
例えば、
$title = "testtesttest"; この場合は $get = testtestt
$title = "テストテスト"; これだと $get = テストテ爛
こういった文字化けを回避するような、いい方法は無いでしょうか?
0687nobodyさん
2008/06/04(水) 10:15:53ID:???0688686
2008/06/04(水) 10:27:56ID:???調べてみたところ、Jcode.pmのモジュールみたいですね。
今までずっとjcode.plばっかだったので知らなかった…
さっそく試してみます。
どうもありがとうございました。
0689670
2008/06/04(水) 13:24:15ID:44uKn/lkスミマセン基地外でした。
0690nobodyさん
2008/06/05(木) 00:08:18ID:S7Nj2GEOどうせならifにあわせてelとefとか2文字にしてほしかったん
0691nobodyさん
2008/06/05(木) 00:28:25ID:???0692nobodyさん
2008/06/05(木) 22:21:15ID:???0693nobodyさん
2008/06/05(木) 23:21:13ID:???switch-caseでいいと思うのになんでgiven-whenにしたのかな?Switch.pmがあるから?
0694nobodyさん
2008/06/06(金) 01:28:23ID:???http://pc11.2ch.net/test/read.cgi/php/1008355270/85
Perl の自然言語的体裁には switch-case より given-when の方が
よりしっくりくるかもね。
0695nobodyさん
2008/06/07(土) 20:54:21ID:8brPzE2oこのサイトに
http://v.youku.com/v_show/id_ch00XMjc3MDQ1MzI=.html
を入力するとリンク先が4つほどでます。
これを自分でもPerlCGIで再現したいんですが、4つのリンク先をどうやって出してるのかわかりません。
HTMLのソースを見る限り4つないんです。
ないものを何かを元にして解析?してるようです。
4つの違いは以下です
http://f.youku.com/player/getFlvPath/sid/12008536434684686883/st/flv/fileid/までは一緒以下が
0200640400482D864C5AE000AEF6647CED502D-7AA2-9D39-9256-82A8FD7CC8D9
0200640401482D864C5AE000AEF6647CED502D-7AA2-9D39-9256-82A8FD7CC8D9
0200640402482D864C5AE000AEF6647CED502D-7AA2-9D39-9256-82A8FD7CC8D9
0200640403482D864C5AE000AEF6647CED502D-7AA2-9D39-9256-82A8FD7CC8D9
です。
<a charset="400-002-2-4" href="javascript:sendVideoLink('XMjc3MDQ1MzI=','0200640400482D864C5AE000AEF6647CED502D-7AA2-9D39-9256-82A8FD7CC8D9');">??</a>
これが大本でこれを解析してるんでしょうか。
こういうのはどうやって解析すればいいのでしょうか?
よろしくお願いします。
0696nobodyさん
2008/06/07(土) 21:00:16ID:???0697nobodyさん
2008/06/07(土) 21:25:47ID:8brPzE2oですが4つとは限らないんです。
このビデオは4つですが、者によっては8つとかになります。
それをどうやって特定してるのかがわかりません。
0699nobodyさん
2008/06/07(土) 21:43:36ID:8brPzE2o???
それではyoukufireではどうやってやってるんでしょうか?
こういうのってどういうスレに行くと知ってる人がおられるのでしょうか?
フラッシュ関連なのでしょうか?
自分はPerlをかじる程度しか知らないのでついここに来てしまったのですが。
アドバイスお願いします
0700nobodyさん
2008/06/07(土) 22:34:21ID:???全くのスレ違いです。
0701nobodyさん
2008/06/07(土) 22:55:37ID:8brPzE2o他で質問してみます。ありがとうございました。
0702nobodyさん
2008/06/07(土) 23:03:35ID:???結局、HTTPレスポンスを解析する必要があるから。
そして、HTTPレスポンスの意味を把握するには、
sidなどユニークなIDのパターン解析と
youkuで使われてるファイル取得swfの内部解析も必要。
この意味が分からない次元じゃ、到底ムリ。
0703nobodyさん
2008/06/07(土) 23:36:39ID:8brPzE2ohttp://www.kasai.fm/perlHTTP/
http://www.kasai.fm/perlHTTP/decode.html
からとりあえずそのhttpレスポンスとやらを実際に見てみようと思いましたが。
どうもCan't locate BASE64 in @INC エラーがでまして。
このモジュールをactiveperl5.8.1のppm(リポジトリは初期状態のまま1つです)でいれようとしましたが
ない模様です。
MINE::Base64って自分でコンパイル?でしたっけができないとダメなものなのでしょうか。
0704nobodyさん
2008/06/07(土) 23:53:12ID:8brPzE2ogetHTTPの
#use MIME::Base64;
require('BASE64');
を
use MIME::Base64;
#require('BASE64');
にしたらエラーが出ませんでした。動いてるかはわかりませんが。
0705nobodyさん
2008/06/08(日) 00:05:22ID:???というか、質問内容が初心者未満の単なる教えて君だぞ。
最低限、ドキュメント読むかググってから書き込め。
0706nobodyさん
2008/06/08(日) 00:14:24ID:Mcg1bojLそこからフラッシュのURLを抜き出すところまではできそうです。
>sidなどユニークなIDのパターン解析と
>youkuで使われてるファイル取得swfの内部解析も必要。
これを検索とか意味を探してきます。
0707nobodyさん
2008/06/08(日) 14:55:02ID:???package foo;
*{foo::hoge::bar} = sub {1};
$hoge = foo->hoge;
$hoge->bar();
Can't locate object method "hoge" via package "foo"
アレ?
0708nobodyさん
2008/06/08(日) 16:56:29ID:???基本から一通り勉強し直したらいいんじゃないかな。
http://www.kt.rim.or.jp/~kbk/perl5.005/perlmod.html
http://www.kt.rim.or.jp/~kbk/perl5.005/perlobj.html
0709nobodyさん
2008/06/08(日) 18:03:33ID:???サンクス
最後のページ
Summary
なすべきこと。今、あなたは部屋を出てオブジェクト指向方法論に関する書籍を購入して、そして六ヶ月かそこらの間悩む必要があるでしょう。
ワロタ
0710nobodyさん
2008/06/08(日) 18:41:29ID:NYonUevmhoge {
$this = shift;
return $this;
}
bar{1}
hoge->bar()ってやったら呼べるんだけどbarはhogeと同じ空間にあるのが変というか
つまり単純化するとこんな感じ。
*{foo::hoge::bar} = sub {1};
print foo->hoge->bar(); エラー
print foo::hoge::bar->(); 動くが気もい
*{foo::hoge::bar} = sub {1}; #もっとキモイ
$top = foo::hoge;
print eval ($top ."::bar");
勉強してきます
しかしあんま資料ないっぽい
■ このスレッドは過去ログ倉庫に格納されています