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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2008/02/25(月) 19:25:51ID:???
Perlのコーディングで困ってる人のスレです。

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

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

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

お勧めサイトは >2 以降

前スレ http://pc11.2ch.net/test/read.cgi/php/1189939783/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0611 ◆TWARamEjuA 2008/05/28(水) 21:20:10ID:???
(´-`).。oO(Net::CIDRでよさそうな。。。)
06125972008/05/28(水) 21:26:18ID:???
my @temp = ( $#array1 <=> $#array2 ) == -1 ) ? ( 0..$#array2 ) ; 0..$#array1;
こんな前処理してから、>>599のmap対象配列に、( 0..\$temp ) って感じかなぁ?

エレガントさには欠けるけど、これが可読性保つギリギリかな?
06135972008/05/28(水) 21:28:46ID:???
動作確認してないからtypoしまくり。まぁ分かるよね?(苦笑
06146072008/05/28(水) 21:31:18ID:???
>>611
私へのレスですね。
明日調べてみます
06155992008/05/28(水) 22:23:24ID:???
>>610
ああ、
@array1 = ( undef, undef ) ;
は考えてたけども、それは想定してなかったw
>>612の解で良いんじゃね? 助長を厭わないならば、
map{ 略 } 0 .. $#{$_[0]} , 0 .. $#_ - 1 ;
っつー荒技もw
自分のスクリプトじゃ絶対やんないけどね。
06165992008/05/28(水) 22:27:21ID:???
>>615
s/助長/冗長/
0617nobodyさん2008/05/29(木) 03:05:45ID:???
mapがいまいち理解し切れなくて使ってないんだが覚えとくべき?
覚えると便利そうだけど。
0618nobodyさん2008/05/29(木) 03:45:40ID:???
やってることは、forやforeachと変わらん。
違うっていえば、{}の中を、引数リストのそれぞれの要素で実行した結果をリストとして返すってとこか。
かなり便利な局面もある。覚えとくべきだとは思う。

@res = map{ $_ + 10 } (1,2,3,4,5) ;
print join("\n",@res);
---結果---
11
12
13
14
15
0619 ◆TWARamEjuA 2008/05/29(木) 07:02:31ID:???
my $Now_Date = sprintf qq|%04d/%02d/%02d %02d:%02d|, map {
$_->[0] += 1900;
$_->[1]++;
@$_;
}[(localtime)[5,4,3,2,1]];

2008/05/28 07:02
って出るかと思う。
0620nobodyさん2008/05/29(木) 08:23:18ID:???
>>617
シュワルツ変換という定番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"; '

06216072008/05/29(木) 17:51:57ID:???
Net::CIDR::cidrlookupでうまくいきそうなのですが、
IPアドレスのチェックを行いたいと思ってます。
ググると、以下の様な正規表現がありますが、
\d(バックスペース)の意味が分かりません。
どういう意味なんでしょうか?

\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
0622nobodyさん2008/05/29(木) 17:53:57ID:???
0-9
06236072008/05/29(木) 17:54:42ID:???
すみません。
\dは数字でした。
申し訳ない
06246072008/05/29(木) 18:10:05ID:???
またまたお願いします。

正規表現で/をマッチさせたいのですが、
以下であってますでしょうか?

$hoge =~ /\//
06256072008/05/29(木) 18:11:58ID:???
すんません

\/で、いけるみたいです。
お騒がせしました。
0626nobodyさん2008/05/29(木) 18:15:31ID:???
$hoge =~ m(/);

すこしは綺麗?
0627nobodyさん2008/05/29(木) 18:19:11ID:???
>>617だけどレスありがとう。
シュワルツ変換とかまだいまいち理解できないけど良さそうだね。
sortは結構使うから思い処理の部分で使うのはいいかも。
でも問題は後で読み直して何してるか理解できなくなりそうな所だな。
0628 ◆TWARamEjuA 2008/05/29(木) 20:45:58ID:???
>>620
つっこみおおきに♪
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:???
まーmapは便利だってことだ
0633nobodyさん2008/05/30(金) 11:57:18ID:???
XML::DOMを使ってXHTMLに広告を挿入するCGIを書いたのですが、use encoding "utf8";
を書くとローカルで文字化けしてしまいます。これをコメントアウトすると
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はよくわかりません。
0634nobodyさん2008/05/30(金) 12:22:33ID:???
>>632
だれも「mapが不便」なんて言ってないがな
明らかにバッドノウハウなコードを曝してる奴をくさしてるだけで
0635nobodyさん2008/05/30(金) 12:23:13ID:???
すみません。自己解決しました。use encoding "utf8";をコメントアウトして
utf8::is_utf8($doc->toString) ? print encode('utf-8', $doc->toString) : print $doc->toString;
とすればいいみたいです。utf8フラグというのが関係しているみたいなので、
調べてみます。おさわがせしました。
0636nobodyさん2008/05/30(金) 12:40:26ID:???
>>635
これはマジメに調べまくった方がいい。
慣れるまでPerl5.8以降でハマる最大の原因。
0637nobodyさん2008/05/30(金) 12:50:11ID:???
BOM付けてたりして・・・
0638nobodyさん2008/06/01(日) 07:19:24ID:???
BOMBなら付いてますw
0639nobodyさん2008/06/02(月) 12:34:35ID:???
Wed, 12 Mar 2008 21:20:11 GMT
Last-Modified↑これをtimeの値に変換する方法を教えてください。
3600秒以内とかの判定に使いたいので。
0640nobodyさん2008/06/02(月) 12:49:16ID:???
>>639
timelocal
0641nobodyさん2008/06/02(月) 12:57:39ID:???
>>640
ありがとうございました!
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:???
>>642
%mons = (
Jan => 1, Feb => 2, Mar => 3, Apr = 4, # ……以下省略
);
$mon = $mons{$mon};

とかどうよ?
0644nobodyさん2008/06/02(月) 15:22:18ID:???
>>643
ありがとうございます。
連想配列は普段全く使わないので、この機会に試してみます!
0645nobodyさん2008/06/02(月) 15:44:50ID:???
>>643は、どうせ後で1引くのに、どうしてわざわざ1足すのさ?w
0646nobodyさん2008/06/02(月) 16:15:30ID:???
>>645
ほんとだ><
お前頭いいな
すみません><
0647nobodyさん2008/06/02(月) 17:46:33ID:VCfcjQkN
CPANを使わずにモジュールを使いたいのですが、なかなかうまくいきません。
HTML::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:???
Template.pmをHTMLというディレクトリを作ってそこにいれる
0649nobodyさん2008/06/02(月) 18:08:23ID:VCfcjQkN
>>648
ありがとうございます。
助言どおり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:???
CPAN にモジュールの関連性とか書いてなかったっけ?
0651nobodyさん2008/06/02(月) 18:18:22ID:???
関連性とかじゃなくて依存のこと
0652nobodyさん2008/06/02(月) 18:25:00ID:VCfcjQkN
http://q.hatena.ne.jp/mobile/1195733487
↑必要としているモジュールは違うものの、
この人と同じ状況なのかな、と思うんですがどう思いますか?

同じ状況だとすると、不可能ですよね
FTPであげることしかできませんので。。。
0653nobodyさん2008/06/02(月) 18:41:40ID:???
呼び出されてるDLLがWin用のコンパイル済みDynaLoader.pmを、Linuxにそのままコピーしたんでしょ? たぶん。
Linuxでコンパイルし直さないとムリ。よってムリ。
0654nobodyさん2008/06/02(月) 18:45:29ID:VCfcjQkN
あぁ・・・やはり無理ですか。

5.00503で使えるHTML::Templateの代わりのようなものがほしいんですが、
どこを探せばいいでしょうか。
何度も申し訳ありません。
0655nobodyさん2008/06/02(月) 18:52:18ID:VCfcjQkN
HTML::Templateの昔のバージョンとかなら5.00503でも動きますかね?
0656nobodyさん2008/06/02(月) 18:56:19ID:???
その知識だと、HTML::Templateなんて必要ないじゃん!的な使い方しかしてしないと予想されるので、
自前でテンプレート化した方が早い。

スキン対応と銘打ってる配布CGIのソース読んだ方が早い気がする。
0657nobodyさん2008/06/02(月) 18:59:25ID:???
HTML をテンプレート使って出力するようにすると病み付きになる
0658nobodyさん2008/06/02(月) 19:03:56ID:???
5.005のこと詳しくしらないけど、DynaLorderとかって、標準で入ってないの?
ってか、>>649の内容を見るに、DynaLorderでわなくて、Digest::MD5(.so)が無いんでないの?(これも標準でない?)

まあなければ、Digest::MD5はXSモジュール含んでるから、
そのサーバー上でコンパイルし直さないと実行できないのは、>>653と同じ意見だけど。
0659nobodyさん2008/06/02(月) 19:07:00ID:VCfcjQkN
PerlってHTMLと親和性ないですよね〜。
テンプレート使えないとなると、めんどくさくなるけど、まぁがんばります。
ありがとうございました。
0660nobodyさん2008/06/02(月) 19:49:04ID:???
自分の未熟さを言語のせいにするなよw
HTMLと最も親和性のある言語として、Perl/CGIが一世風靡しただろ。
0661nobodyさん2008/06/02(月) 19:51:49ID:???
>>657
kwsk
0662nobodyさん2008/06/02(月) 19:59:46ID:???
>>661
ちょっとかじった程度の人でもデザイナーとプログラマを切り分けられる利点がある
0663nobodyさん2008/06/03(火) 00:57:17ID:etSjPPZK
PostやGetで送られてきたURIエンコードをデコードしてハッシュに確保するような
プログラムを作ったのですが
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 って文字があるのか application/x-www-form-urlencoded って文字があるのかで簡単に判別着く
multipart/form-data の処理は CGI.pm 使ってね♪
0665nobodyさん2008/06/03(火) 01:12:56ID:???
>>663
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
>>665
ありがとう!
0667nobodyさん2008/06/03(火) 01:58:53ID:???
>>659
テンプレートエンジン、自分で作るという手もある。
そんなに難しくないよ。
Compositeパターンでも使えば。
0668nobodyさん2008/06/03(火) 09:41:38ID:???
>>659
HTML をふつうに書く
HTML なかに <%BODY%> とか、挿入場所を示す識別子をいくつか用意して書き込む
プログラムからテンプレート HTML を読み込む
正規表現で置換

たったこれだけです。
0669nobodyさん2008/06/03(火) 11:07:04ID:???
Template::Toolkitならともかく
HTML::Templateは単純な処理だしね
さくっと使いたい時には便利、無けりゃ無いでどうにでもなる
0670nobodyさん2008/06/03(火) 12:56:41ID:K4KbdDUT
Perlでindex.cgiを作って
そのCGIですべてを管理するような仕組みを作った場合
やっぱindex.cgiにアクセスが集中してよくなかったりするんですか?
0671nobodyさん2008/06/03(火) 13:31:41ID:???
index.cgi で処理させる内容を挙げてくれないとまったくわからない

自分は普通のエディタ (関数へのジャンプとか無くて色分けだけ) なので
まったく違う処理はファイル分けてる
0672nobodyさん2008/06/03(火) 17:01:51ID:???
多分聞きたい事って、hoge1.cgiとhoge2.cgi…hoge100.cgiとかあったら
それぞれ頭で同じ事やってるから、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:???
>>670
俺それやってる
wikiみたいに書けるテキストファイルを自動で携帯/PCに最適化してValid XHTML出力する、みたいな。
0674nobodyさん2008/06/03(火) 17:56:29ID:???
bloxsomだっけ?
0675nobodyさん2008/06/03(火) 19:41:27ID:???
perl関連のプロジェクトは企画倒れが本当に多いね。
企画倒れというより、制作者が途中で飽きて、ブームになっても、そのまま放置……みたいな。
かのCPANだって、一部のモジュール以外は、姥捨山みたいになってる。
古いモジュールに、パッチ送ってもメール不達とか多すぎるんだよ!
0676nobodyさん2008/06/03(火) 20:52:43ID:???
tp://www.drk7.jp/weather/
ここの 東京の 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:???
[1]->'#text'

ダンプしろよ
0678nobodyさん2008/06/03(火) 21:21:10ID:???
print $tree->{weatherforecast}{pref}{area}[1]{info}[1]{temperature}{range}[1]{#text}
manual嫁。
あと、XMLの中にareaやinfoやrangeの要素が1つしか無い場合に配列要素に
ならないのがTreePPの仕様なので、例えばinfoが1要素しか無い場合は
print $tree->{weatherforecast}{pref}{area}[1]{info}{temperature}{range}[1]{#text}
とアクセスしなくてはいけない。オプションで回避できるけど。
06796702008/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:???
つか、ほとんどのWEBアプリケーションは、特定ファイルに負荷集中するがな。
06816702008/06/04(水) 00:28:11ID:KcodebuX
>>680
あ、じゃあ余計な心配しなくて大丈夫かぁ
0682nobodyさん2008/06/04(水) 01:09:20ID:???
つ mod_perl
0683nobodyさん2008/06/04(水) 05:38:01ID:???

A:opendir でファイル一覧を取得する

B:予めファイル一覧をそれ用のメモファイルに書き出しておいてそれを読みこんで取得

AとBではどちらが負荷が少ないですか?

0684nobodyさん2008/06/04(水) 06:05:53ID:???
自分で調べられる手間を人に仮託するな。
0685nobodyさん2008/06/04(水) 08:14:25ID:???
>>670
>>672に答えが書いてあるのだが、何故それを無視する?
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:???
jfold
06886862008/06/04(水) 10:27:56ID:???
2分での光速のお返事ありがとうございます。

調べてみたところ、Jcode.pmのモジュールみたいですね。
今までずっとjcode.plばっかだったので知らなかった…

さっそく試してみます。
どうもありがとうございました。
06896702008/06/04(水) 13:24:15ID:44uKn/lk
>>685
スミマセン基地外でした。
0690nobodyさん2008/06/05(木) 00:08:18ID:S7Nj2GEO
ところでさ…何故elsifなんだと思う?
どうせならifにあわせてelとefとか2文字にしてほしかったん
0691nobodyさん2008/06/05(木) 00:28:25ID:???
ごめんなさいごめんなさい
0692nobodyさん2008/06/05(木) 22:21:15ID:???
Cか何かでやってる人いたな。
0693nobodyさん2008/06/05(木) 23:21:13ID:???
最近5.10を使うようにしてんだけどgiven-whenが馴染めない
switch-caseでいいと思うのになんでgiven-whenにしたのかな?Switch.pmがあるから?
0694nobodyさん2008/06/06(金) 01:28:23ID:???
>>693
http://pc11.2ch.net/test/read.cgi/php/1008355270/85
Perl の自然言語的体裁には switch-case より given-when の方が
よりしっくりくるかもね。
0695nobodyさん2008/06/07(土) 20:54:21ID:8brPzE2o
http://www.vid-dl.net/

このサイトに
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:???
一部の0に1足してるだけじゃないの?
0697nobodyさん2008/06/07(土) 21:25:47ID:8brPzE2o
>>696
ですが4つとは限らないんです。
このビデオは4つですが、者によっては8つとかになります。
それをどうやって特定してるのかがわかりません。
0698nobodyさん2008/06/07(土) 21:33:39ID:???
>>697
youkufireかなんかAPI使ってるんだろ。
Perlとは関係ないな。
0699nobodyさん2008/06/07(土) 21:43:36ID:8brPzE2o
>>698
???
それではyoukufireではどうやってやってるんでしょうか?

こういうのってどういうスレに行くと知ってる人がおられるのでしょうか?
フラッシュ関連なのでしょうか?
自分はPerlをかじる程度しか知らないのでついここに来てしまったのですが。


アドバイスお願いします
0700nobodyさん2008/06/07(土) 22:34:21ID:???
HTTPに関して勉強して下さい。
全くのスレ違いです。
0701nobodyさん2008/06/07(土) 22:55:37ID:8brPzE2o
http???
他で質問してみます。ありがとうございました。
0702nobodyさん2008/06/07(土) 23:03:35ID:???
いや、どこで質問しても無駄だと思うよ。
結局、HTTPレスポンスを解析する必要があるから。

そして、HTTPレスポンスの意味を把握するには、
sidなどユニークなIDのパターン解析と
youkuで使われてるファイル取得swfの内部解析も必要。

この意味が分からない次元じゃ、到底ムリ。
0703nobodyさん2008/06/07(土) 23:36:39ID:8brPzE2o
なるほど。
http://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:8brPzE2o
すいません
getHTTPの

#use MIME::Base64;
require('BASE64');
を
use MIME::Base64;
#require('BASE64');
にしたらエラーが出ませんでした。動いてるかはわかりませんが。
0705nobodyさん2008/06/08(日) 00:05:22ID:???
MIME::Base64は標準モジュールだ。
というか、質問内容が初心者未満の単なる教えて君だぞ。
最低限、ドキュメント読むかググってから書き込め。
0706nobodyさん2008/06/08(日) 00:14:24ID:Mcg1bojL
そうなんですか。とりあえずperlでwebページを読み込む実験は成功しました。
そこからフラッシュの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:???
>>707
基本から一通り勉強し直したらいいんじゃないかな。
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:???
>>708
サンクス

最後のページ
Summary
なすべきこと。今、あなたは部屋を出てオブジェクト指向方法論に関する書籍を購入して、そして六ヶ月かそこらの間悩む必要があるでしょう。

ワロタ
0710nobodyさん2008/06/08(日) 18:41:29ID:NYonUevm
うーん継承させても
hoge {
$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");

勉強してきます
しかしあんま資料ないっぽい
■ このスレッドは過去ログ倉庫に格納されています