Perlコーディング初心者質問スレ Part 61
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2010/06/05(土) 21:11:10ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >2 以降
前スレ http://pc11.2ch.net/test/read.cgi/php/1251989472/
0081nobodyさん
2010/06/10(木) 23:11:27ID:???0082nobodyさん
2010/06/10(木) 23:33:06ID:???0083nobodyさん
2010/06/11(金) 00:04:39ID:???> こういう場合どうしたらいいんでしょうか?
マニュアルとソースを読む。
http://search.cpan.org/dist/libnet/Net/SMTP.pm
008480
2010/06/11(金) 01:15:57ID:HNRsRFk/>83
マニュアルに明記されてます?(見落としてるだけ?
ソースは・・・すいません見てみます!
008580
2010/06/11(金) 02:34:15ID:HNRsRFk/メールアドレスの@がperlに解釈されてしまっていたのが問題でした。
ついで質問なのですが、メールアドレスの受け取りをCGI::Applicationにて
my $mail = $self->query->param('mail');
のような感じで受け取っています。
この部分を
my $mail = 'test@test.co.jp';
とすることで正しくメールが送られることは確認しました。
my $mail = $self->query->param('mail');
の時点で@をperlに解釈させないようにするにはどうしたらいいでしょうか?
受け取ってから@をエスケープすればいいんだとは思いますが、
他にスマートな方法ありましたらアドバイスお願いします。
0086nobodyさん
2010/06/11(金) 03:29:52ID:???0087nobodyさん
2010/06/11(金) 09:02:50ID:???CGIに渡ってくるものがそもそもおかしいんじゃねーの?
0088nobodyさん
2010/06/14(月) 21:40:31ID:mh5UZ2p/方法はないでしょうか?
色々テストのスクリプトを書いているのですが、「エラーが出る」確認の
テストを書こうと思ったら、die で死ぬのを eval することは出来ても
STDERR への表示を消すことが出来なくて困っています。
STDERR への出力を一旦抑制して、また元に戻すといったことはできない
でしょうか?
0089nobodyさん
2010/06/14(月) 22:26:22ID:???0090nobodyさん
2010/06/15(火) 12:07:10ID:FKT5DQzrありがとうございます。分かりました。
0091nobodyさん
2010/06/15(火) 23:46:20ID:???perlで、FTPSによるファイル送信を行いたいと考えております。
調べたところNet::FTPSSLというモジュールがあるのですが、
現在契約しているホスティングサーバーではインストールされて
おりません。
そこでNet::FTPSSLのモジュールをダウンロードしてみると、FTPSSL.pmという
ファイルがありました。このファイルをrequireするなどして、なんとか
インストールしないで動作させたいと考えておりますが、このような
事は可能なのでしょうか?
0092nobodyさん
2010/06/15(火) 23:54:04ID:???0093nobodyさん
2010/06/21(月) 00:35:12ID:5zE9MeIY申し訳ありません。
あまりCatalyst版には人がいないようなので、
こちらにも質問させて下さい。
Catalyst を勉強中です。
モデルをCatalystから分離した方が良いとは
知っていますが、とりあえず勉強中なので、
app_create.pl model で DBIC を作りました。
ところが出来上がった Schema/Result/ 以下の
クラスにメソッドを定義しても呼び出す事が
出来ません。
ログではこのように出ています。
Can't locate object method "foo_bar" via package "DBIx::Class::ResultSet"
見るとResult以下のクラスのベースクラスは
DBIx::Class:Core でした。
自分でも何かとんちんかんな事を聞いている気がするのですが、
Catalyst で ResultSetに メソッドを定義したい
場合はどのようにすればよいか教えていただけますか。
宜しくお願いします。
0094nobodyさん
2010/06/21(月) 07:15:52ID:???カタリーは使ったことないからわからないが。
useし忘れてパッケージ名で呼ぶとそのエラーメッセージがでますよね。
"そのパッケージにそんなメソッドないです"なのでバージョン違いの資料を使ってないか等も疑ってみたらどうでしょう。
0095nobodyさん
2010/06/21(月) 17:53:00ID:???0097194
2010/06/21(月) 23:42:36ID:???ありがとうございます。
やはりそうですよね。。
そこに追加しているんですが、呼び出せないです。
気になったのはResultSet 云々のエラーメッセージがでてるけど、そこのクラス群はDBIC::Core が親になっている事でした。
モデルは自動生成させているので、手では作っていないです。
何かの手順間違いでおかしな事になってるんですかね。
再確認します。
0098nobodyさん
2010/06/22(火) 00:30:08ID:???load_components に ResultSetManager とメソッドに ResultSet 属性が必要なのですね。
Catalyst というよりはまるまるDBICでした。
ありがとうございました。
0099nobodyさん
2010/07/01(木) 11:32:54ID:???/(忘ABC)DEF/ or die;
忘の所に何と書くのか教えてください。
0100nobodyさん
2010/07/01(木) 11:43:38ID:???/DEF/ or die;
じゃだめなん?
0101nobodyさん
2010/07/01(木) 11:47:10ID:???0102nobodyさん
2010/07/01(木) 12:28:30ID:???010399
2010/07/01(木) 12:50:10ID:???>>101
>>102
みなさんありがとうございます。
やりたいのは>>102さんの言う通りなのですが、説明が下手で
どうとでも取れるような書き方だったと反省しています。
回答ありがとうございました。
0104nobodyさん
2010/07/21(水) 09:46:20ID:???$image->Distort("virtual-pixel"=>"Transparent"
と指定しても背景が透過になってくれません。
Black, White, Random など別の物を指定すると変更されます。
ImageMagickの問題なのですが、Perlで使用しているのでこちらへ質問させていただきました。
スレ違いでしたら誘導をお願いします。
0105nobodyさん
2010/07/30(金) 18:42:05ID:???バックグラウンドカラーは設定した?
$image->Set('background' => 'none');
0107nobodyさん
2010/08/02(月) 03:40:13ID:FdS+e4Ne0108102
2010/08/02(月) 04:45:31ID:???0109nobodyさん
2010/08/02(月) 13:10:55ID:???0110Perl神
2010/08/02(月) 17:08:54ID:9KfPyaTP0111nobodyさん
2010/08/02(月) 21:04:27ID:fXTYTb4c配布されてるCGIゲームを改造中の初心者です。とほほのPerl入門とか見ながらやってます。参考書とかは持ってません
モンスターの経験値などを設定するのにモンスターの画像名を番号にして
番号が大きければ大きいほど経験値も多くなる・・・という風にしたかったのですがいい方法が思いつきませんでした。
文字列の中の数字("100.gif"とかの100)を数値に変換して扱う方法を教えて欲しいのですが・・・無いですかね
0112nobodyさん
2010/08/02(月) 21:10:15ID:28r5QWdlmy $file = "100.gif";
my $ex = $1 if $file =~ m/^([0-9]+)/;
print $ex; # 100
こういうこと?
0114nobodyさん
2010/08/09(月) 18:03:38ID:K6ZCyo17巡回して取得したRSSをブラウザに書き出すだけのプログラムです。
チェック先のRSSが200件程度まではうまく動作していたのですが、
現状250件でHTMLへの書き出しが途中で止まってしまいます。
最初はタイムアウトを疑っていたんですが、
ブラウザのkeep-alive、httpd.confのtimeout値も300になっています。
(プログラム実行時間は30秒程度)
スレッド数に上限とかあるんでしょうか?
なにかヒントを頂けたらありがたいです。
よろしくお願いいたします。
0115nobodyさん
2010/08/09(月) 18:18:39ID:???0116114
2010/08/09(月) 18:25:11ID:K6ZCyo17チェック対象のRSS数のスレッドをnewしてthread->joinで終了待ちしてます。
なので、仰るとおり100以上のスレッドを発行している状態です。。。
ありがとうございます。修正してみます。
0117114
2010/08/09(月) 18:38:49ID:K6ZCyo17なのでスレッド数はマックス50件です。
0118nobodyさん
2010/08/09(月) 18:41:09ID:???最終実行日時
実行結果の HTTP レスポンス
取得に掛かった時間
を記録して、どこが引っかかってるのかチェックしてみては?
0119114
2010/08/09(月) 18:51:43ID:K6ZCyo17特定のRSSが原因かと思い、チェック順序を逆順にしたりして検証しましたが、
やはり数が問題のようです。どのようなRSSをチェックさせても220〜225件程度
チェックしたあたりでHTMLの出力がとまってしまいます。
(コンソールでも同様です)
※追加情報
apacheのエラーログには「Out of memory!」、「Ouf of memory(Needed 8164 bytes)」
と記述されていました。
スタックサイズが足りない???
0120nobodyさん
2010/08/12(木) 21:38:33ID:???0121nobodyさん
2010/08/14(土) 15:19:13ID:5o00tDGC*in = $query->Vars();
Encode::from_to(*in, 'shiftjis', 'utf8');
でUTF-8にエンコードされません
やりかたが違うんでしょうか?
0122nobodyさん
2010/08/14(土) 15:50:24ID:5o00tDGCmy $query = CGI->new;
*in = $query->Vars();
foreach (%in) {
Encode::from_to($_, 'shiftjis', 'utf8');
$_ =~ s/</</g;
$_ =~ s/>/>/g;
$_ =~ s/'/&squot;/g;
$_ =~ s/"/"/g;
}
0123nobodyさん
2010/08/26(木) 19:02:59ID:???ヒントなどあればお願いします。
PerlでHTMLを出力し、その中で動的にグラフを生成しようとしています。
まず以下のようにして、望みどおりの出力を得ました。
print '<img src="graph.cgi">'; #OK
これを以下のようにすると、画像でなく文字列が表示されてしまいます。
print '<img src="'. (require 'graph.cgi') . '">'; #NG
またモジュール化してgetした場合も、同じく文字列が表示されてしまいます。
print '<img src="'. $graph->get(\@data). '">'; #NG
なお、いずれも処理側は画像を以下のように出力しています。
print "Content-type:image/gif\n\n";
binmode STDOUT;
print $image->gif; #GD::Graphを使っている
文字列が表示されてしまう場合でも、
出力をSTDOUTからファイルに変えてみれば画像はちゃんと生成されているようです。
疑問1) 1番目の例はOKで他がNGな理由がいまいちわかりません。
疑問2) 3番目のようにOOPな感じで通したい場合、どう記述すればよいのかわかりません。
PerlでなくCGIの範疇だったらすみません。判断がつかないのです。
0124nobodyさん
2010/08/26(木) 19:27:18ID:???graph.cgi でグラフ出力
HTML は
print '<img src="graph.cgi">';
で OK
graph.cgi にパラメータを渡す必要があっても、
graph.cgi?x=??&y=??
っていう風にすればいいだけなので解決できる
0125123
2010/08/26(木) 20:13:27ID:???\@dataとして渡したい内容が、わりと複雑なため(24時間のアクセス統計3〜5種類など)
リファレンスで渡せると楽だったのですが
レスありがとうございました
0126nobodyさん
2010/08/26(木) 21:45:13ID:???つかそれならHTMLは静的でいいんじゃないか
0127nobodyさん
2010/08/31(火) 07:50:54ID:???<img src="data:image/gif;base64,ここ">
でいけるかも
0128123
2010/08/31(火) 14:10:20ID:???モジュールの側で return MIME::Base64::encode($image->gif); として、
これを教えていただいた通りデコート指定(?)つきでimgタグに入れたら見事に表示されました
これですっきりしました。どうもありがとうございました
しかしこれ、PerlというよりHTMLの問題だったかもしれませんね
見分けがつかずこちらで質問してしまい、失礼いたしました
0129nobodyさん
2010/09/04(土) 16:33:18ID:???そんなことしてGD使ってサーバに負荷かけるより
棒グラフなら素直に
$resultW=幅ピクセル;
print '<img src="pink.gif" style="width'.$resultW.'px;height:5px">
とかってやった方が早くね?
円グラフならGD使う意味は分かるが。。
0130nobodyさん
2010/09/07(火) 21:05:39ID:KEDp6nh+崩してしまうので、ある一定の長さ以上は省略したいです。
正規表現に組み入れてできませんよね?
となると、一旦配列に入れて一行ごとに処理せねばなりませんか?
0131nobodyさん
2010/09/07(火) 22:10:00ID:???$text =~ s{($yourURLregex)} {
my($url, $face) = ($1, $1);
...; # $face を適当に縮める
qq|<a href="$url">$face</a>|;
}eg;
0132nobodyさん
2010/09/07(火) 23:24:24ID:???テストで
$yourURLregex= "s?https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+";
$face = substr($face,1,30);
でやってみたけど、エラーが出ちゃいます
下の式抜いてもだめです
0133nobodyさん
2010/09/08(水) 00:34:07ID:???1回目でurlにマーク付けて、2回目でマーク内をsubstrでカット
不格好ですけど
0134nobodyさん
2010/09/08(水) 05:08:05ID:???エラーって出るのは、あなたがエラーしてるからからでは
0135nobodyさん
2010/09/08(水) 17:31:08ID:???0136nobodyさん
2010/09/08(水) 17:47:40ID:J/6++5D2さくらインターネットですが。
0137nobodyさん
2010/09/08(水) 19:15:02ID:???してみ?
0138nobodyさん
2010/09/08(水) 21:52:41ID:???> $yourURLregex= "s?https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+";
エラーにはならないが $, が展開される。
http://perldoc.perl.org/perlvar.html
>>136
>>1
>>137
それだけでは実行結果に影響しない。
http://perldoc.jp/docs/perl/5.12.1/perlop.pod
print(
"'abcde' =~ '$_' => ", 'abcde' =~ $_ ? '' : 'un', "match\n",
"'abcde' =~ /$_/ => ", 'abcde' =~ /$_/ ? '' : 'un', "match\n",
"'cdefg' =~ '$_' => ", 'cdefg' =~ $_ ? '' : 'un', "match\n",
"'cdefg' =~ /$_/ => ", 'cdefg' =~ /$_/ ? '' : 'un', "match\n",
) for '^[a-e]{5}\z', qr/^[a-e]{5}\z/;
0139nobodyさん
2010/09/08(水) 23:03:55ID:???0140nobodyさん
2010/09/09(木) 21:27:24ID:???0141nobodyさん
2010/09/14(火) 10:39:40ID:RoOJ13yO検索エンジンからのアクセスでキーワードだけ抽出しているんですが、
エンジン毎に左オペランド?が違うのと、文字コードが違うようです。
やっぱりエンジン毎に処理を分岐するしかないですかね?
文字化けが発生する毎に分岐処理に新処理を付け加えています。
なんとか処理を単純化できないだろうか。
0142nobodyさん
2010/09/14(火) 10:54:46ID:???デコード処理はguessとかでどうにでもなるけれども
0143nobodyさん
2010/09/14(火) 11:40:18ID:???でも結局それぞれ違うんだから処理は書かなきゃしょうがない
と思う。
0144nobodyさん
2010/09/14(火) 11:47:53ID:RoOJ13yO手元の逆引き大全の索引をみる限り、両者ともでてこない。
そんなによく使う関数なの?
0145nobodyさん
2010/09/14(火) 11:59:48ID:RoOJ13yOhttp://www.ksknet.net/perl/encodeguess.html
0146nobodyさん
2010/09/14(火) 12:08:36ID:???0147nobodyさん
2010/09/14(火) 12:50:04ID:RoOJ13yOgoogle yahoo bing goo exite biglobe nifty ・・・
そのレベルまでかな。まるっきり知られてないっぽいエンジンまで分岐するとなると分岐が増えて増えて・・・
先日の外部テキストに分離した部分は分岐の部分なんですよ。
require して使う話ね。
これなら、分岐の部分だけ増設できるでしょ。
0148nobodyさん
2010/09/14(火) 13:36:17ID:???perl界隈では有名(なのか?)なアクセス解析スクリプトの AWStats
http://awstats.sourceforge.net/
これのパッケージ内に、検索エンジンごとの定義ファイルみたいなのが含まれてるから、
それを参照するがよろし。
但し基本英語圏のエンジンがほとんどで、日本語圏のサイトは少ない。
あと、各エンジンごとの検索パラメータ、googleならq=,yahooならp=とかもある程度はわかるが、
さすがに文字コードまではわからんから、そこらへんは自前でやる必要があるけど、
かなり参考にはなると思う。
0149nobodyさん
2010/09/14(火) 21:57:32ID:???cgiファイル、ログファイル、HTML出力すべてutf-8にしようと思ってるんですが、
use 〜;やbinmode ~;とか一般的に必要とする物ってあるんでしょうか?
自分の環境はwindowsで借りようと思ってる鯖がfreeBSDでperl5.8のようです。
ついでに文字コードがutf-8Nで改行コードはCR+LFでおkですか?
0150nobodyさん
2010/09/14(火) 22:42:40ID:???> 右も左もわからないんで教えてください。
>>1-2
何から勉強していいのか分からない
http://hibari.2ch.net/test/read.cgi/php/1101491473/
△▲ WebProg 初心者の質問 Part22 ▼▽
http://hibari.2ch.net/test/read.cgi/php/1272872528/
【Perl】掲示板を使ろう!
http://hibari.2ch.net/test/read.cgi/php/988890976/
自分の作ったCGIスクリプトをデバッグするスレ
http://hibari.2ch.net/test/read.cgi/php/1011174442/
自作CGIを評価するスレ
http://hibari.2ch.net/test/read.cgi/php/1049514428/
> 一般的に必要とする物ってあるんでしょうか?
無い。必要な処理を必要なだけ実装しなさいな。
> 文字コードがutf-8Nで改行コードはCR+LFでおkですか?
BOM無しが無難。
http://ja.wikipedia.org/wiki/UTF-8
スクリプトの改行コードは実行環境に、出力の改行コードは
HTTPの仕様や閲覧環境に合わせる。
0151nobodyさん
2010/09/15(水) 07:35:37ID:???その点英語圏は楽でいいよなー
0152nobodyさん
2010/09/15(水) 08:52:32ID:jrRD4zmE0153nobodyさん
2010/09/15(水) 10:56:10ID:FawmhmXvPHPだと$_GETと$_POSTで出来るのですがPerlではどのように書くのでしょうか?
0154nobodyさん
2010/09/15(水) 11:57:40ID:???my $m = new CGI;
my $name = $m->param('name');
0155nobodyさん
2010/09/15(水) 13:38:01ID:5exFybXuしてて$var001、$var002、・・・$var850 くらい変数があります。
スクリプトのはじめに
our $var001;
our $var002;
our $var003;
・
・
とか
my ($var001,$var002,$var003・・・)
みたいなことを書かないといけないのですが、
これをまとめて一括で定義する方法があれば教えてください。
0156nobodyさん
2010/09/15(水) 13:43:17ID:???0157155
2010/09/15(水) 13:49:49ID:5exFybXuあとから、「あ”、しまった!」ってなってます。orz
0158nobodyさん
2010/09/15(水) 13:49:52ID:???my %var
0159nobodyさん
2010/09/15(水) 13:59:12ID:???0160nobodyさん
2010/09/15(水) 14:12:01ID:???0161nobodyさん
2010/09/15(水) 14:21:16ID:q2N7SUAH0162nobodyさん
2010/09/15(水) 14:30:47ID:???そういうプログラムなら、
my $var001;
my $var002;
my $var003;
…
とあえてずらっと書いておいた方が、この後のコードを読むの覚悟しろと宣言しているようでかえってよいかと。
タイプするのが大変というなら、Excelで my $var001; という値を入れて、あとは850行分ドラッグすれば一気に作れるよ。
宣言だけで850行…
それに、同じ悩むなら、すでに書いたコードを直した方がよいよ。それこそperlで置き換えてみれば?
s/\$var(\d{3})/\$var\[$1]/g;
そうすれば、my @var; でok\(^o^)/
スカラー変数を宣言できたところで、どっちみちpushやshiftやspliceのような操作はできないしね。
0163nobodyさん
2010/09/15(水) 14:32:00ID:???サニタイズの方法がわからん
0164nobodyさん
2010/09/15(水) 14:39:17ID:???sub sanitize{
$html = shift;
$$html =~ s/&/&/g;
$$html =~ s/</</g;
$$html =~ s/>/>/g;
$$html =~ s/"/"/g;
$$html =~ s/'/#&39;/g;
return 0;
}
0165nobodyさん
2010/09/15(水) 14:39:34ID:q2N7SUAH@hairetu = '';
も
@hairetu = "";
も、$hairetu[0] に空欄?が入っちゃうのね。
正解は
@hairetu = ();
だた。
配列の初期化(空欄化)って他にどうしてる?
0166nobodyさん
2010/09/15(水) 14:42:09ID:???0167nobodyさん
2010/09/15(水) 14:43:14ID:???ホントにぎやかだねw
0168nobodyさん
2010/09/15(水) 14:46:02ID:???0169nobodyさん
2010/09/15(水) 14:46:19ID:q2N7SUAHそういやそうだなw
しかし、皮肉交じりに人をバカにするその口調は会社でも同じなのか?
だとしたら相当に嫌われてるぞおまえ。
0170nobodyさん
2010/09/15(水) 14:48:59ID:???0171nobodyさん
2010/09/15(水) 14:52:23ID:???0172nobodyさん
2010/09/15(水) 14:54:17ID:???これはどういう概念なんだろうか?
これこそ初期化?
0173nobodyさん
2010/09/15(水) 15:01:44ID:???0174nobodyさん
2010/09/15(水) 15:14:26ID:q2N7SUAHいよ!色男!
0175nobodyさん
2010/09/15(水) 15:18:27ID:???わかったかな
0177nobodyさん
2010/09/15(水) 16:11:27ID:???0178nobodyさん
2010/09/15(水) 16:50:47ID:???0179nobodyさん
2010/09/15(水) 17:06:18ID:???0180nobodyさん
2010/09/15(水) 17:12:15ID:???ただのサブルーチンという言い方はおかしい
■ このスレッドは過去ログ倉庫に格納されています