Perlコーディング初心者質問スレ Part 60
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2009/09/03(木) 23:51:12ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >2 以降
前スレ http://pc11.2ch.net/test/read.cgi/php/1234752149/
0755nobodyさん
2010/03/27(土) 13:42:43ID:???CGIのサブセットっぽいから動くんじゃね?
use libしなくても実行ファイルのルートからはたどってくれなかったっけ?
0756nobodyさん
2010/03/29(月) 09:22:31ID:???コマンドラインで試すときとCGIとして起動されるときは
また環境が違うから、置き場所決めてuse libしといた
方がいいんじゃないかな。
0757nobodyさん
2010/03/29(月) 14:57:28ID:???LWP::UserAgent->new;
を使っているのは理解しております。
HTTP::Requestもプログラム中では使っていますが、
なぜ、モジュール利用の宣言で
use LWP::UserAgent;
だけで、
use HTTP::Request;
となっていないのでしょうか?
0758nobodyさん
2010/03/29(月) 15:23:53ID:???0759nobodyさん
2010/04/02(金) 14:04:38ID:???0761nobodyさん
2010/04/02(金) 15:33:40ID:???イメージは下記のようにしたいのですが、エラーになります。
my $a = "aaa/bbb/ccc";
$a =~ sm|aaa/bbb|zzz|g;
0762nobodyさん
2010/04/02(金) 15:44:52ID:???sm///演算子なるものはない。
s///のセパレータに/以外を使いたいという意味なのか?
であれば、s|aaa/bbb|zzz|g でよいのではないか?
0764nobodyさん
2010/04/02(金) 16:44:23ID:???0765nobodyさん
2010/04/02(金) 20:09:24ID:TSIkzIjB0766nobodyさん
2010/04/03(土) 02:45:47ID:???0767nobodyさん
2010/04/03(土) 18:36:58ID:???〜内容〜
==============================
テキストファイルに上記のように囲まれた部分があり、HTML として整形して
表示する際にこの部分を blockquote で囲んで出力したいと思ってます。
単純に 「===」 を </blockquote> にしたら、1行目でいきなり閉じちゃうので駄目でしたw。
今は1行目をテキストファイルに存在しえない様な文字列に置換してから、
「===」 を </blockquote> に置換してから、1行目を置換するといったことをやってます。
しかしどう考えても正規表現で1行で済むように思えてならないんです。
ちなみに 「=」 の個数は2〜3ほどのバラつきがあります。
0768nobodyさん
2010/04/03(土) 18:53:47ID:???内容中に=がないことが前提だが。
use utf8;
use Encode;
$str = <<EOF;
<更新情報>========================
〜内容〜
==============================
EOF
$str =~ s|=+([^=]+)=+|<blockquote>$1</blockquote>|sg;
print $str;
0769nobodyさん
2010/04/03(土) 20:22:50ID:???使わせていただきます m(_ _)m
0770nobodyさん
2010/04/03(土) 21:16:07ID:???(<更新情報>[=]+.*?=[=]+)
=[=]+ とやらずに [=]+ とすると文字化けするので、こうなった次第。
euc-jp をやめて utf8 にした方がいいのだろうか?
0771nobodyさん
2010/04/03(土) 21:17:14ID:???下記の考え方であってますでしょうか。
当たりカードを20枚発行し、100枚の中から抽選して一つでも
発行カード番号が入っていれば当選、としたかったのですが、
スマートな方法が見つからなかったので、このように書いて
みました。
# $rate%の確率で当選者が決定。
my $rate = 20;
# 抽選カード番号を100枚の中から発行
my $rand_num = int((rand(100))) + 1;
# 抽選カード番号が設定値($rate)以下であれば当たり(1〜$rateまでに含まれている)。
if($rand_num <= $rate){ 当選処理; }
0772768
2010/04/03(土) 22:13:10ID:???Perlは内部ではutf-8を扱うのが基本
ソースももちろんutf-8
そして
use utf8;
という一文を最初のほうに加える (こうしないと2バイト文字を2文字としてカウントしてしまう)
入力と出力もutf-8であるべきだけど、
もし他の文字コードを用いたい場合には Encode.pm でデコード・エンコードしてやり、
常に内部ではutf-8を扱っている状態にしてやるのがよい
あと内部で扱う utf-8 と入出力で扱う utf-8 は別物だったりするので要注意
0774nobodyさん
2010/04/03(土) 22:52:36ID:???ENV{'HTTP_HOST'}の有無で判別しても問題はないでもんでしょうか?
0775nobodyさん
2010/04/03(土) 23:02:47ID:???'1' => { 'name' => 'TEST1', 'url' => 'http://〜', 'file' => 'test1.txt' },
'2' => { 'name' => 'TEST2', 'url' => 'http://〜', 'file' => 'test2.txt' },
'3' => { 'name' => 'TEST3', 'url' => 'http://〜', 'file' => 'test3.txt' }
};
foreach my $targetinfo (sort keys(%{$urldata})){
my $req = HTTP::Request->new(GET => $urldata->{$targetinfo}->{'url'});
上記のようなことをしたら
index.cgi: Argument "" isn't numeric in sprintf at [PATH] line 45.
とエラーが出たのですが、今いじってるスクリプトに sprintf を使っていないのでエラーの言ってる意味がわかりません。
それとも、そもそも間違ったことをしてるのでしょか?
0776nobodyさん
2010/04/03(土) 23:18:09ID:???ごめんなさい別のファイル見てましたw
質問の仕切り直しです。
@mediainfo = map { $_->[0] } sort { sprintf("%02d", $a->[3]) cmp sprintf("%02d", $b->[3]) || $b->[2] cmp $a->[2] } map { [$_, split /\t/] } @mediainfo; # レギュラー (曜日設定) と日付でソート
こうしたとき、[3] には曜日を表す 0-7 の数字が入ってるのですが、毎週無い予定に関しては曜日設定を入れてません。
そこで sprintf でエラーが出てる状況です。
split した結果、配列の中で値の無い部分に対して 0 を代入することって出来るのでしょうか?
データに -1 でも入れておけと言われればそれまでなのですがw
0777nobodyさん
2010/04/03(土) 23:27:56ID:???それ、エラーじゃなくてwarning。
その後、文字列"00"としてちゃんと実行はされている。
どうしてもその表示を消したければ、その部分で
no warnings "numeric";
0778nobodyさん
2010/04/03(土) 23:43:36ID:???0779nobodyさん
2010/04/03(土) 23:59:36ID:???@mediainfo = map { $_->[0] }
sort { sprintf("%02d", ($a->[3] ? $a->[3] : 0)) cmp sprintf("%02d", ($b->[3] ? $b->[3] : 0)) || $b->[2] cmp $a->[2] }
map { [$_, split /\t/] } @mediainfo; # レギュラー (曜日設定) と日付でソート
こうしました。
強引且つ見栄えが汚いですがww
0780nobodyさん
2010/04/04(日) 00:13:51ID:???とかでいいじゃん
あと @mediainfo の要素数がかなり多いようだったら sprintf とかは事前にすませといて sort ブロックの中はなるべく単純な比較だけにするようにしたほうがいいかも
0781nobodyさん
2010/04/04(日) 13:38:51ID:???0782nobodyさん
2010/04/06(火) 18:12:36ID:???open(INFH, '<', $config->{'file_mailform_config'});
my $config;
my $cnt = 0;
while (my $line = <INFH>){
chomp $line;
my ($tmpNAME, $tmpTITLE, $tmpALLOWVAL) = split(/\t/, $line);
$config->{$cnt}->{'name'} = $tmpNAME;
$config->{$cnt}->{'allowval'} = $tmpALLOWVAL;
$config->{$cnt}->{'title'} = $tmpTITLE;
$cnt++;
}
close(INFH);
この様にデータ内容を読み込んで、データの1行目はヘッダなので
undef $config->{0};
として削除したつもりでしたが、
foreach my $inputitem (sort keys %{$config}){
print "$config->{$inputitem}->{'name'}<br>\n";
}
としたら、1行目があった場所 (undef する前に表示されてた場所) が空行で出力されました。
undef では連想配列の要素を削除することは出来ないのでしょうか?
undef を外すとヘッダ行が表示されます。
0784nobodyさん
2010/04/06(火) 18:55:48ID:???無事、期待度通りの動作になりました。
0785nobodyさん
2010/04/07(水) 23:42:24ID:???にて
Software error:
This Perl not built to support threads
とのメッセージ
さくらのレンタルサーバーなんですがthreadsはサポートしてないのでしょうか・・・
0788nobodyさん
2010/04/14(水) 01:52:36ID:???my @check = $self->query->param('check');
foreach $temp(@check){
print $temp;
}
チェックボックスを何箇所チェックしようが、一つ目の値しか取り出せません。
URLにはキチンと &check=xxx&check=yyy〜 と渡ってきているように見えるのですが、、、
0789nobodyさん
2010/04/14(水) 01:53:37ID:???0790788
2010/04/14(水) 02:06:40ID:???どういうことでしょうか?
foreach $temp(@check)の部分で配列から1要素取り出せてるので[]は必要ないという認識なんですが、
間違ってますか?
0791nobodyさん
2010/04/14(水) 02:20:18ID:???0792788
2010/04/14(水) 02:30:47ID:???という形で渡せればいいということでしょうか?
試してみましたが、
my @check = $self->query->param('check')
で値がひとつも取れなくなりました。。。
というか、基本的なことなんでしょうがググっても情報得られず。。。
調べ方が悪いのかな・・
0793nobodyさん
2010/04/14(水) 02:49:00ID:???0795788
2010/04/14(水) 03:23:59ID:???my @check = $self->query->param('check');
print "@check";
見事に一つ目しか取れてませんね。。。
0796nobodyさん
2010/04/14(水) 03:56:01ID:???my $q = new CGI;
my @check = $q->param('check');
foreach $a(@check) {
print $a . "<br>\n";
}
とりあえずこれは動くんだけど、CGI::Applicationだとだめなんかね
0797788
2010/04/14(水) 04:00:45ID:???うーん、、、一つ目しかとれないっすね。。。
HTML部分が悪いんでしょうか?
<input type="checkbox" value="xxx" name="check"/>
<input type="checkbox" value="yyy" name="check"/>
HTML部分はこんな感じです。
0798nobodyさん
2010/04/14(水) 04:17:49ID:???でやってんでしょ?
なんでいまさらHTMLを疑うのか。。
0800nobodyさん
2010/04/14(水) 04:27:42ID:???久しぶりにPerlインスコして書いてみたら動いたというだけなので、これ以上はサポートできず申し訳ない
環境はWS2003+IIS6+Perlis.dll
0801788
2010/04/14(水) 04:33:19ID:???どうにもならなかったので力業ですが解決させました。
name要素をcheck_1,check_2に変更した上で、
my $i = 0;
while ($self->query->param("check_$i")) {
# 処理
$i = $i + 1;
}
とすることで無事に取り出せました。
解決しましたが頭の中は?でいっぱいでございます。。。
ありがとうございました。
0802nobodyさん
2010/04/14(水) 22:49:50ID:???CGI::Applicationの方はhashにしか対応してないからじゃない??
Applicationは使ったことないからどういう使い方をするのかあまり知らないが、
そもそも重複したparam名を使用すべきではないとか。。
CGI::Application こっちのsub array はハッシュのみ。
http://cpansearch.perl.org/src/MARKSTOS/CGI-Application-4.31/lib/CGI/Application.pm
CGI.pm こっちのsub paramは、arrayに対応。
http://cpansearch.perl.org/src/LDS/CGI.pm-3.49/lib/CGI.pm
0803nobodyさん
2010/04/14(水) 23:02:13ID:???>>796がうまく動かないらしい。
まぁ何かの間違いだと思うけど
0804nobodyさん
2010/04/23(金) 00:45:52ID:???それぞれ先頭から順番に値がセットになるような感じで並んでいたとします
また、それぞれに同じ値はないものとします
配列Aから条件式でマッチングを行い
必要なデータを取り出します
この条件式は配列Bでは使えないのですが
同じ条件で配列Bから抜き出すにはどうしたらいいでしょうか?
@a = (あ,い,う,え,お);
@b = (1,2,3,4,5);
@aのみ条件式でマッチング
最終的に
あ&1、う&3、お&5
みたいな感じで取り出したいんです
0805nobodyさん
2010/04/23(金) 01:01:20ID:???0806nobodyさん
2010/04/23(金) 01:04:47ID:???マッチング時に要素番号と要素をセットにした連想配列を作って
さらにその連想配列のkeyでループを回せばいいんじゃないかな
0807nobodyさん
2010/04/23(金) 01:06:19ID:???0808nobodyさん
2010/04/24(土) 20:33:36ID:???my @array = qw(1 2 3 4 5);
say "found!(1)" if 3 ~~ @array;
say "found!(2)" if @array ~~ 3;
上記で「found!(1)」しか出力されません。
スマートマッチは可換ではないのでしょうか?
0809nobodyさん
2010/04/24(土) 23:01:11ID:???0810808
2010/04/25(日) 14:09:14ID:???ttp://perldoc.jp/docs/perl/5.10.0/perlsyn.pod
ここにも。
use 5.010;
my @array = qw(1 2 3 4 5);
my $number = 3;
say "found!(1)" if $number ~~ @array;
say "found!(2)" if @array ~~ $number;
say "found!(3)" if grep $_ == $number, @array;
0811nobodyさん
2010/04/25(日) 14:27:40ID:???演算子が増えるとわくわくするよねw
0813nobodyさん
2010/04/25(日) 19:58:29ID:???それ普通に実行されるけど・・・
ちなみにうちの環境
v5.10.0 built for MSWin32-x86-multi-thread
Binary build 1004 [287188] provided by ActiveState
Built Sep 3 2008 13:16:37
0814812
2010/04/25(日) 21:00:28ID:???http://search.cpan.org/~dapm/perl-5.10.1/pod/perl5101delta.pod#Changes_to_type-based_dispatch
> Changes to type-based dispatch
> The smart match operator ~~ is no longer commutative.
0815nobodyさん
2010/04/25(日) 21:50:33ID:???evalで囲っただけじゃOracleの戻りを待っちゃってうまい実装を探してます。
0816nobodyさん
2010/04/26(月) 00:42:37ID:???eval {
local $SIG{ALRM} = sub { die 'timeout'; };
alarm 10;
# ディスパッチ
alarm 0;
};
unless ($@ =~ /timeout/) {
}
0817808
2010/04/26(月) 03:49:45ID:???>>813
>>814
ありがとうございます。
スッキリしました。( ^ー゚)bグッ!
ちなみに私のは、
v5.10.1 built for MSWin32-x86-multi-thread
Binary build 1007 [291969] provided by ActiveState
Built Jan 26 2010 23:15:11
です。
0818nobodyさん
2010/04/26(月) 12:44:34ID:???そです。
でもその実装だと10秒でdieしてくれなくてOrcleから処理が戻ってきてからじゃないとハンドリングできないんですよ。
0819nobodyさん
2010/04/26(月) 13:04:32ID:???DBIのマニュアルにまさしくDBD::Oracleだとうまくいかないからこうしろってのが
書いてあるのでためすといいよ。
0820nobodyさん
2010/04/30(金) 10:50:25ID:???内容的には非常に単純で
<hoge>テスト</hoge>
とすると、
<font style="font-size:x-large">テスト</font>
のように置換するだけです。
ここでみなさんにお伺いしたいことは
テストの文字を取得して加工する
というものです。
以下のような式を考えましたが、
($art) = $mes =~ /<hoge>(.*?)<\/hoge>/;
if($art){
$mes =~ s/<hoge>(.*?)<\/hoge>/<span style=\"font-size:140%;\">$art<\/span><span style=\"font-size:180%;\">$art<\/span>/g;
}
一回の書き込みの中で2回使用しようとすると、
2回目の方まで一回目の内容で適用されてしまいます。
↑よくよく考えてみれば、当たり前ですが。
なんとか、一回の書き込みの中で複数回使用できるようにしたいのですが、
どのようにすればよろしいでしょうか?
宜しくお願い致します。
0821nobodyさん
2010/04/30(金) 10:58:23ID:???0823nobodyさん
2010/04/30(金) 22:13:35ID:???表示用とは別に保存しておくといいよ
0824nobodyさん
2010/05/01(土) 04:35:43ID:???下記で取得が行えません。
my $q = new CGI();
my $fh = $q->upload($fieldname);
my $mime =uploadInfo($fh)->{'Content-Type'};
エラーログには下記がはかれていました。
Premature end of script headers:
Can't use an undefined value as a HASH reference at /image line 82, <DATA>
他にもContent-Typeを取得する方法があればそれでもいいのですが、
このエラーも解決してみたく持ってますので、ご教示いただけますと
幸いです。
0825nobodyさん
2010/05/01(土) 05:00:33ID:???0827nobodyさん
2010/05/01(土) 07:52:23ID:???my $mime = $info->{'Content-Type'};
ようわからんけど uploadInfo から帰ってきた値が undef だと言われてるみたいだけど
0828nobodyさん
2010/05/01(土) 09:41:14ID:???moduleのドキュメント見てみたけど、
uploadInfoに渡すのはfile handleじゃなくファイル名じゃないとダメなんじゃない?
[module doc]
$filename = $q->param('uploaded_file');
$type = $q->uploadInfo($filename)->{'Content-Type'};
unless ($type eq 'text/html') {
die "HTML FILES ONLY!";
}
0829824
2010/05/01(土) 18:35:17ID:???これってフォームからアップロードされた画像を対象にContent-typeの
取得を行うんですね。。根本的に間違えてました。。
指定した画像のContent-Typeを取得する簡単な方法はないもので
しょうか。
拡張子がgifなのに実際はpngであったりとするケースがあるため、
Content-Typeで判定をしたいのですが、ご存知でしたらどうか
教えてください。
0830nobodyさん
2010/05/01(土) 19:30:27ID:3heBO4S1それってUploader云々ではなくて、例えばローカルとかに保存してあるファイルのことかい?
だったらGDでもImage::Magicでも使って、画像を判定すればいいんでね。
まあヘッダの数十〜百バイト程度の判定で済むから、自前でバイナリ読んで解析するとかもあり。
(GDではWindows-bmpに未対応なので、以前自分で書いた)
0831nobodyさん
2010/05/01(土) 20:59:59ID:???はい、そうです。
Image::Magickはサーバに入れられなかったので、GDで
できる方法があれば教えていただけますと幸いです。
よろしくお願いいたします。
0832nobodyさん
2010/05/01(土) 21:32:17ID:???ttp://labs.gmo.jp/blog/ku/2007/05/8.html
phpだがperlに応用可能だろう
0833nobodyさん
2010/05/01(土) 22:50:54ID:???ただ、PNG が無いっていうw
0834nobodyさん
2010/05/01(土) 23:06:47ID:???モジュールあるのね
そこそこ設定の揃ってるマジックファイルって、誰か配布して無いっすかね
0835nobodyさん
2010/05/02(日) 02:25:22ID:???ありがとうございます。
勉強になりました。
最終的には、MMagicを使用させていただきました。
これ便利ですね。
この場をお借りし御礼申し上げます。
0836nobodyさん
2010/05/10(月) 14:42:47ID:???$q = new CGI;
@hoge = $q->param('hoge');
@hoge = ("hoge", "hogehoge")
と同じ方法をCGI.PMをもちいらないで出来ませんか?
read(STDIN, $q, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, $q);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
@FORM{$name} = $value;
}
@FORM{$name} = ("hoge", "hogehoge")
みたいな感じで
0837nobodyさん
2010/05/10(月) 14:45:58ID:???0838836
2010/05/10(月) 18:06:05ID:???@pairs = split(/&/, $q);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
push(@hoge, $val) if $key =~ /hoge/;
@FORM{$name} = $value;
}
で自己解決しました。
お邪魔しました。
0839836
2010/05/10(月) 18:07:53ID:???だった。
0840nobodyさん
2010/05/10(月) 20:01:30ID:???0841nobodyさん
2010/05/12(水) 14:33:57ID:l5g8HUnE文字化けしています。どうすれば良いのでしょうか。
Perlのソースに記述した漢字は、パソコンのテキストエディタ表示、
IE上のフォーム表示、サーバのファイル上のいずれでも文字化けして
いません。
フォームを表示するhtmlの<meta>タグではShift-JISを指定しています。
よろしくお願いします。
0842nobodyさん
2010/05/12(水) 21:13:03ID:???ソースが無いことにはなんとも
0844nobodyさん
2010/05/14(金) 23:42:43ID:???変換?してたような気がするんですけど、なんでしたっけ?
ちなみに GD 使ってます
0846nobodyさん
2010/05/15(土) 00:26:24ID:???GD にメモリの中にあるバイナリを GD と結びつける方法は無いのかしら?
一旦ファイルに書き出さないと駄目な感じなんですかね・・・
0847nobodyさん
2010/05/15(土) 00:35:15ID:???SEE GD Manpage
>Alternatively, you may create a GD::Image object based on an existing image by providing an open filehandle, a filename, or the image data itself.
0848nobodyさん
2010/05/15(土) 00:52:53ID:???「ファイルから読め」
って事っすね orz
0849nobodyさん
2010/05/15(土) 02:58:47ID:???〜 ファイル名 $tmp_filename で画像を作る処理 〜 省略 〜
my $imgbin = GD::Image->new($tmp_filename);
こうやるとエラーログに
[Sat May 15 02:42:21 2010] index.cgi: Use of uninitialized value $pkg in concatenation (.) or string at /perl/lib/Symbol.pm line 129.
が出てきます。
Symbol.pm の 129 行目を含む関数は qualify なんですが、 GD.pm のソースを見ても qualify が有るわけも無く、デバッグしようにも負えません。
GD::Image->new($tmp_filename); に必要な引数があるのかと思って、CPAN の GD とこを見ても、サンプル自体がこういう記述の仕方。
コレって解決方法無いんでしょうか?
0850nobodyさん
2010/05/15(土) 13:25:56ID:???これでファイルの読み込みしなくて済むようになった
ImageToBlobみたいのがあるかと思ったら、そのままGDに投げてよかったんですね
0852nobodyさん
2010/05/15(土) 20:30:59ID:???↑
これか!
言われて今気が付いたw
0853nobodyさん
2010/05/15(土) 23:27:44ID:???なぜURLエンコードが必要が教えて下さい
0854nobodyさん
2010/05/16(日) 02:50:47ID:???■ このスレッドは過去ログ倉庫に格納されています