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/
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");
勉強してきます
しかしあんま資料ないっぽい
0711nobodyさん
2008/06/08(日) 18:52:18ID:???*{foo::hoge::bar} じゃなくて *{foo::bar}
hogeなんていうpackage作ってないし。
0712nobodyさん
2008/06/08(日) 19:09:16ID:???それだ! ありがとうやっとわかったよ。
てっきり package a::b::c;
ってやると
a
a::b
a::b::c
ってのが自動的に生成されると思ってた。
0713nobodyさん
2008/06/08(日) 20:02:49ID:???見かけ上はできるけだろうけどPerlのオブジェクトは名前空間に変数結び付けてるだけだからなあ
と思ったけどもう一度勉強した方が良さげだね
0714nobodyさん
2008/06/08(日) 20:20:35ID:???CGIであるデータをホームページ上に表示することをやっています。
5000件ほどのデータをfetchrow_arrayで1行ずつフェッチしていますが
どうもフェッチ処理に時間がかかっているようです。
実際に必要なのは20件ほどで、他はページ送りで表示可能。
検索エンジンの検索結果ページなんかをイメージしていただければ。
そこで、不要なフェッチを無くすために、
複数行を飛ばしてフェッチすることってできますか?
もし他に改善策があれば教えてください。
一応、SELECTの段階で20件だけを取り出す方法を思いつきました。
0715nobodyさん
2008/06/08(日) 20:39:35ID:???@arrayの高速操作が必要ならスライス操作とか調べてみると吉
SELECTで絞れるなら断然そっちのほうが早いと思うよ。
0716nobodyさん
2008/06/08(日) 22:10:54ID:???ありがとうございます。
スライス操作調べてみました。SELECTでLIMITつければいいんですかね?
これで必要な分だけのフェッチですみましたが、どうも時間がかかるようです。
ちょっと複雑なSQL文なんでそっちのほうがボトルネックのようですorz
SQL文のほうを考え直そうと思います。
0717nobodyさん
2008/06/09(月) 12:35:45ID:???SELECT FOUND_ROWS();
>>715
>>716はSQLの話じゃなくて、
大規模の配列使うなって話で、
my @temp = splice( @array, 0, 20 );
的なことでしょ。
SQL文はスレ違い。
0718nobodyさん
2008/06/09(月) 15:41:11ID:???生えーぞ。
0719nobodyさん
2008/06/09(月) 16:00:10ID:???0720nobodyさん
2008/06/09(月) 19:29:41ID:BYZvhcIN其の都度ひっかかって質問するより勉強したほうがはやいよ
リファレンスページみっけてプリントアウトしとけ
0721nobodyさん
2008/06/09(月) 23:24:50ID:???11
11000
↑これをソートすると
11
11000
122
↑こんな風になってしまいます。
11
122
11000
↑こんな感じで大きい順にソートする方法を教えてください。
0722nobodyさん
2008/06/09(月) 23:26:19ID:???0724nobodyさん
2008/06/13(金) 02:38:01ID:???*** form.html ***
<input type="file" name="gazou1">
<input type=その他 ...>
*** form.cgi ***
use CGI;
$q = new CGI;
@names = $q->param();
foreach $name (@names) {
$value = $q->param($name);
if (input type が file だったら ) {
ファイル受信処理
}
なんらかの配列に格納
}
と、したいのですが、
inputのtypeは調べられないのでしょうか?
inputのnameで判断するしかないのでしょうか?
0725nobodyさん
2008/06/13(金) 09:17:11ID:???ブラウザから渡されるデータ自体に type 属性の値が含まれて
いないのだから、CGI プログラム上から調べる事はできない。
ref $value でアタリを付ける事はできる。
http://perldoc.jp/docs/perl/5.10.0/perlfunc.pod#item_ref_EXPR_ref_reference
http://perldoc.jp/docs/modules/CGI.pm-2.89/CGI.pod
(「ファイル・アップロード・フィールドの作成」の項)
0726nobodyさん
2008/06/13(金) 10:25:57ID:???$unit->{101}->{point} = 2.5;
$unit->{130}->{point} = 6.2;
$unit->{150}->{point} = 3.2;
と代入してあります
このポイント(2.5、6.2等)を元にして@idをソートしたいのですが
@id = sort { $unit->{$_}->point <=>$unit->{$_}->point } @id
とまで考えて、$aや$bをどのように使ったら良いのか分らなくなりました
よろしかったらどのように表記したら良いのか教えてください
0728726
2008/06/13(金) 11:00:28ID:???Perlメモはいつも参考にさせて頂いてまして
・複数の項目でソートする
・自分で決めた順番でソートする
の応用でなんとかなるかと思ったのですが
どうにも分らずこちらでお伺いしました次第です
どの辺りを応用すればよろしいでしょうか?
0729726
2008/06/13(金) 11:18:24ID:???先にmapでポイントの配列を作る事でなんとか出来ました
@id = map { $_->[0] } sort { $b->[1] <=> $a->[1] } map { [$_,$unit->{$_}->{point} ] } @id
ありがとうございました
そしてお騒がせ致しました
0730nobodyさん
2008/06/13(金) 11:37:27ID:???0732726
2008/06/13(金) 12:41:47ID:???コードがすっきりしました
>>730さん、ありがとうございます
0733nobodyさん
2008/06/13(金) 12:51:42ID:???sortでなんで$_がでてくるのかわからない。$aと$bしかないだろ。
grepやmapと混乱してないか?
0734726
2008/06/13(金) 13:06:56ID:???>>726のソースに間違えて辿り付いたので勘違いしてました
てっきり配列の要素を引っ張り出したらそれが$_になるのかと・・・
で、$a,$bはそれが直接比較の対象にならないといけないのかと勘違いしてました orz
0735nobodyさん
2008/06/14(土) 03:33:00ID:???0736nobodyさん
2008/06/15(日) 00:12:38ID:???リファレンスで受け渡しも簡単だし
0737nobodyさん
2008/06/15(日) 01:14:21ID:???普段は問題なく動いているのですが、自宅で試したperlをiswebにアップロードする作業が面倒でたまりません。
そこで質問なのですが、
#!/usr/local/bin/perl
とかの表記を書き換えずとも、上記二つの環境の両方で動くように出来ないでしょうか。
毎度毎度アップロードするときに、全cgiを書き換えているので、そこだけでも何とかしたいんです。
もしくは、専用のFTPソフトみたいなので、アップと同時に書き換えてくれるような奴があると良いなぁって思ってます。
どなたか、よろしくお願いいたします。
0738nobodyさん
2008/06/15(日) 01:43:19ID:???Net::FTP使えば、30分程度で作れるだろ。
0739nobodyさん
2008/06/15(日) 01:43:42ID:???っ ActivePerl をC:\usr\local\以下にインストール
っ 「メンドクセーっ! 頭 #!perl に統一してやんよ。」(Path通ってなかったら知らん)
0740738
2008/06/15(日) 01:45:20ID:???XPでエイリアス作れるようにするソフト使って、iswebに合わせればいい。
0741nobodyさん
2008/06/15(日) 01:52:33ID:???■サーバー
#!/usr/local/bin/perl
require "example.cgi";
■ローカル
#!C:/perl/bin/perl
require "example.cgi";
これなら、example.cgi をアップするだけでOKです。
(意味が違うでしょうか??)
0742nobodyさん
2008/06/15(日) 02:10:08ID:???どうも、有難うございます。
>>741さんのが一番楽そうなので、それでいこうと思います。
どうもありがとうございました。
0743nobodyさん
2008/06/15(日) 14:41:47ID:???PerlでCGIを作っているのですが、いくつかのフォームから入力を取ろうと考えています。
フォームが一箇所ではないので(検索や書き込み、削除等)、送られて来る処理が全く違うため、
送られて来たフォームによって処理を変えたいです。
例えば、検索ならこの関数、書き込みならこの関数、のように分けたいのですが、どのように
実装するのがスマートな方法でしょうか?
考えているのはhiddenで、フォーム別の値を持っておきその値によって分岐しようと思っている
のですが、他にスマートな方法があれば知りたいです。
宜しくお願いします。
0744nobodyさん
2008/06/15(日) 14:43:16ID:???これが一番一般的で分かり易いと思うよ
0745nobodyさん
2008/06/15(日) 15:43:06ID:???postとらgetを使うときのデバッグってどうしてる?
コマンドラインからPOSTを設定する方法とかあるの?
めちゃめちゃ大変なんだが
0747nobodyさん
2008/06/15(日) 17:51:51ID:???そんなに面倒?
0748nobodyさん
2008/06/15(日) 17:55:33ID:???postでもgetでも、与えられる引数をちゃんとチェックすることで、自然と動作の分岐が行えると思うんだけど
0749nobodyさん
2008/06/16(月) 02:30:03ID:???| ̄ ̄ ̄ ̄| [検索] [管理] [ほげほげ]
 ̄ ̄ ̄ ̄
みたいな感じなら、submit に文字列を仕込むという方法が。
0750nobodyさん
2008/06/16(月) 10:59:18ID:???ラジオかセレクト使えばいいと思う。
それかAjaxか
0752nobodyさん
2008/06/16(月) 12:17:52ID:???ロボットのAIの開発からしなきゃだな。
0754nobodyさん
2008/06/16(月) 12:53:21ID:???0755nobodyさん
2008/06/16(月) 23:32:06ID:???0757nobodyさん
2008/06/17(火) 10:41:46ID:???実際に色々な条件でPOST、GETさせてみて、
おかしくなったらそのつど、修正します。
あとは、スクリプトをWEB上にアップしている場合、
ユーザーの方からのバグ報告フォームを設けておくと、
問題発見が早くなります。
コマンドライン POSTで検索:
http://www.google.co.jp/search?hl=ja&rls=GFRC%2CGFRC%3A2007-04%2CGFRC%3Aja&q=%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3%E3%80%80POST&lr=
0759nobodyさん
2008/06/17(火) 14:47:07ID:???0760nobodyさん
2008/06/17(火) 16:37:40ID:???0761nobodyさん
2008/06/17(火) 18:26:54ID:???意地はってないで、「わかりません!教えてください!」っていうのがオトナだよ
0762nobodyさん
2008/06/17(火) 18:42:33ID:???意地はってないで、「詳しいことはわかりません!!」っていうのがオトナだよ
0763nobodyさん
2008/06/17(火) 18:53:23ID:???0764nobodyさん
2008/06/18(水) 12:33:38ID:???0765nobodyさん
2008/06/18(水) 14:54:32ID:???guess_encoding のあとに $utf8 = $enc->decode($inputkeyword); とやってるのですが、エラーとなります。
「 or 」 で split して
my $utf8 = Encode::decode($EncType[0], $inputkeyword);
のようにしたりするのが一般的なんでしょうか?
それとも Encode::decode する際に優先順位を決めたり出来て、それで decode できちゃったりするもんでしょうか?
0766nobodyさん
2008/06/18(水) 15:02:39ID:???一般的かどうかは知らんが、俺は JEncode::_func_getcode() みたいな
ラッパーを書いて使っている。
http://www.donzoko.net/source/JEncode/JEncode.pm
0767nobodyさん
2008/06/18(水) 15:25:31ID:???ありがとうございます。
_func_getcode と _ambiguous、_test_mojicode を見ながら実装します。
0768nobodyさん
2008/06/20(金) 01:13:32ID:???@X1(d,e,f);
と二つリストを作って、
$Y = int(rand(2));
で$Yに0か1を入れて、それに対応したリストを使いたいのですが、どうすればいいですか?
print "$X"$Y"[1]";
のような感じにしたいのですが…。
0769nobodyさん
2008/06/20(金) 01:41:21ID:???0770nobodyさん
2008/06/20(金) 01:43:48ID:???print @{'X'.$Y}[1];
■ このスレッドは過去ログ倉庫に格納されています