Perlコーディング初心者質問スレ Part 59
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2009/02/16(月) 11:42:29ID:gvPTpodw【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >2 以降
前スレ http://pc11.2ch.net/test/read.cgi/php/1218030872/
0797796
2009/06/26(金) 19:27:16ID:???ソース見て気になったけど、サブルーチン内でサブルーチンの定義はPerlではやめた方がいいよ。
0798nobodyさん
2009/06/26(金) 19:38:40ID:???ぅわぁぁぁぁ完璧です。
いままで何度も挫折したんですが初めて解決しました。
まじで感謝してもしきれないですw
>サブルーチン内でサブルーチン サブルーチンからサブルーチン呼ぶ場合はいつもそうしてました(汗
0799nobodyさん
2009/06/30(火) 17:03:31ID:???スクリプトを書こうと思ったんですが,mp4に格納されている
動画(コーデックはh.264)のサイズ(幅×高さ)を取得する方法って
ありますか?
MP4::Infoでイケルかと思ったら,これは動画サイズを取得できない
みたいなんですよ・・
ttp://search.cpan.org/~jhar/MP4-Info-1.12/Info.pm
0800nobodyさん
2009/06/30(火) 23:13:29ID:???0801799
2009/07/01(水) 02:27:40ID:???>mplayer
なるほど.一度外部のアプリを使って画像を生成して
それの大きさを取得するってことですかね?
ちょっとやってみます.
アドバイスありがとうございます.
パッケージマネージャーのほうはよくわかりませんでした.
0802nobodyさん
2009/07/01(水) 10:56:47ID:???0803nobodyさん
2009/07/01(水) 14:19:30ID:???ppm から Audio-Play-MPlayer っていうパッケージを入れて、
実行する CGI/pl と同じディレクトリに MPlayer を置いてください。
使い方は、、、がんばれw
書いてて思ったけど、自分は system() で起動して情報を取得してた気がするw
0804799
2009/07/02(木) 23:42:04ID:???継続してアドバイスありがとうございます。
自分でも色々試行錯誤した結果なんですが、
エンコで使うffmpegが入力する動画情報も返してくれることが
分かったので、そっちを使うことにしました。その結果、
my @out = `ffmpegのパス -i 動画ファイル名 2>&1`;
my ($width, $height);
foreach my $line(@out){
$line =~ /Stream .+ Video: .+ ([0-9]+)x([0-9]+), /;
if($1){
$width = $1;
$height = $2;
last;
}
}
print "$width x $height\n";
こんなかんじで取得することができました。
>>802-803さんや、見守って頂いたスレの皆様に感謝致します。
ありがとうございました。
0805nobodyさん
2009/07/03(金) 13:19:59ID:???やっぱりあるのね。
0806nobodyさん
2009/07/06(月) 17:16:31ID:???どれを採用すればいいのかって話は確立してる?
今のところ、すべての候補でdecodeして文字列長の短いものを採用しているんだけど
良い方法があるなら知りたい。
0807nobodyさん
2009/07/06(月) 17:21:04ID:???0809nobodyさん
2009/07/06(月) 18:28:01ID:???or って文字が入ってれば、最初に来たエンコードでやってみる
すごくあいまいだけど、それで済ましてる
0810nobodyさん
2009/07/06(月) 18:49:46ID:???use strict;
use Encode;
use Encode::Guess qw/euc-jp shiftjis/;
my @words = (
"\xE3\x83\xAF\xE3\x83\xB3", # UTF-8 "ワン"
"\xE6\x8E\x88\xE6\xA5\xAD", # UTF-8 "授業"
"\xE7\x86\xB1\xE3\x81\x84", # UTF-8 "熱い"
);
for my $word (@words) {
my $enc = Encode::Guess->guess( $word );
if( ref $enc ) {
print $enc->name,"\n";
} else {
print $enc,"\n";
}
}
結果は
shiftjis or utf8
shiftjis or utf8
utf8
0811nobodyさん
2009/07/06(月) 19:50:17ID:???0812nobodyさん
2009/07/06(月) 20:21:17ID:???0813nobodyさん
2009/07/06(月) 21:26:40ID:???・・・コストたけえよ。
0814nobodyさん
2009/07/11(土) 14:22:02ID:???arrayを期待して関数を実行する一般的は方法はどのようなものでしょうか?
スカラーを期待するときは print scalar any_func();
とscalarを使えばいける用ですが、arrayを期待するやり方が分かりません。
0815nobodyさん
2009/07/11(土) 14:27:11ID:???要素だけ欲しいなら [ func()]->[0] とか使ってる
もうちょっといい方法があるかもしんないけど
0816nobodyさん
2009/07/11(土) 14:43:15ID:???代入なら($x)= any_func();でいける
0817nobodyさん
2009/07/11(土) 14:57:08ID:???即レスありがとうございます。
any_func() のなかでwantarrayを使用しているのですが、
sub any_func {
my @a = (1, 2, 3);
my $s = 6;
return wantarry ? @a : $s;
}
print文のなかで使用するにはやはり一旦変数にとってからprintでしょうか。
print文のなかで直接any_func()を使用するとscalarのreturnが表示されて困ってました。
0819nobodyさん
2009/07/11(土) 16:34:37ID:???use warnings;
sub any_func {
my @a = (1, 2, 3);
my $s = 6;
return wantarray ? @a : $s;
}
print any_func();
wantarryをwantarrayに直しただけで、ちゃんと123が表示されるよ?
0821nobodyさん
2009/07/11(土) 19:46:53ID:???すみません。勘違いでした。printのなかで使用した場合arrayがかえってきました。
>>820
こんな指定の仕方もあるんですね。知らなかった。。
0822nobodyさん
2009/07/11(土) 22:23:13ID:???リストを返す関数からリストを得る為には、関数を「リストコンテキストで評価してやる」だけでよろしいです。
wantarray() の名の通り、array を want してやるだけ(ここは Perl 用語としては array でなく list と呼ぶべきだけれど)。
リストコンテキストの例としては、リスト代入(配列、ハッシュ、あるいはスカラー変数のリストに対する代入)、リストを取る関数の引数部などがそれにあたります。
print() は引数にリストを取る関数なので print の引数はリストコンテキストで評価されます。ですからこの場合、特別な仕掛けは要りません。
Perl の組込関数は、単項演算子として振舞ういくつかを除き、ほとんどが引数をフラットなリストとして扱います。
そのため scalar() はあっても、対となるはずの list() 組込関数は存在しません。(和ラクダ第3版v2 P.925 参照)
# ちなみに scalar() 自身は単項演算子として振舞う関数のひとつです。
0823nobodyさん
2009/07/16(木) 14:08:29ID:XeS/olXCサーバーはXREAを使っています。
MIME::Parser を使おうと思い、他の箇所は問題無いCGIファイル内に
use MIME::Parser;
という記述を入れると
Argument "2.00_01" isn't numeric in subroutine entry at /usr/local/lib/perl5/site_perl/5.8.8/MIME/Head.pm line 119.
Argument "2.00_01" isn't numeric in subroutine entry at /usr/local/lib/perl5/site_perl/5.8.8/MIME/Head.pm line 120.
Argument "2.00_01" isn't numeric in subroutine entry at /usr/local/lib/perl5/site_perl/5.8.8/MIME/Head.pm line 143.
Argument "2.00_01" isn't numeric in subroutine entry at /usr/local/lib/perl5/site_perl/5.8.8/MIME/Entity.pm line 230.
Argument "2.00_01" isn't numeric in subroutine entry at /usr/local/lib/perl5/site_perl/5.8.8/MIME/Entity.pm line 231.
というエラーが発生してしまいます。
これの回避方法をご教示ください。
よろしくお願いします。
0826nobodyさん
2009/07/21(火) 03:06:34ID:uwULaVdeCGIを作っているのですが、<input type="file" name="file">の扱いがよくわかりません。
ファイルが入力されているかいないかの判別を、definedで判別できるかと思ったのですが、
$cgi = new CGI;
if( defined( $cgi->param( "cgi"))) {}
これだと、いつもifの中にはいってしまいます。
わたしが謝ったコードを書いているのでしょうか?
今は、
if( 4 < length( $cgi->param( "cgi")))
で処理していますが、通常はどのような条件分岐を行うのでしょうか?
(上記の条件分岐は、ファイルをzipファイルをアップロード対象としているため、拡張子の分のファイル名を4文字と考えています。
0827nobodyさん
2009/07/21(火) 03:46:34ID:???ベターなチェック方法は
if( defined( $cgi->upload( "cgi"))) {}
です。
この方法ならファイル選択をせずテキストボックスに適当な文字を入力されたケースにも対応できます(偽が返る)。
0828nobodyさん
2009/07/21(火) 04:02:29ID:???それだと2回も uplodad メソッドが呼ばれるからなんか無駄な気分
if( defined( my $file = $cgi->upload("cgi") ) ){
print $file;
}
こんな感じのがよくね?
0829nobodyさん
2009/07/22(水) 23:40:08ID:???sample.zipのパスパードはtestです。ここまで書きました。
#!/usr/bin/perl
use strict;
my $zipfile = 'sample.zip';
my $pass = 'test';
0830nobodyさん
2009/07/22(水) 23:52:11ID:???my $unzip = "/usr/bin/unzip";
my $file = "$unzip -p -P $pass $zipfile |";
open my $fh, $file;
my @lines = <$fh>;
close $fh;
あとは@linesを書けばOK
0831nobodyさん
2009/07/23(木) 00:27:53ID:???0832nobodyさん
2009/07/23(木) 01:02:41ID:???勉強の為だとしたら質問するんじゃない
0833nobodyさん
2009/07/23(木) 08:23:53ID:???0834nobodyさん
2009/07/23(木) 10:26:53ID:???明記されてるし、IO::Uncompress::Unzipははっきりとは
書いてないけどパスワード与えるインタフェースがなさげ
なのでこちらも多分対応してない。
0835nobodyさん
2009/07/24(金) 22:10:31ID:???> 書いてないけどパスワード与えるインタフェースがなさげ
> なのでこちらも多分対応してない。
return $self->HeaderError("Encrypted content not supported")
if $gpFlag & (ZIP_GP_FLAG_ENCRYPTED_MASK|ZIP_GP_FLAG_STRONG_ENCRYPTED_MASK);
そうみたいだね。
0836nobodyさん
2009/07/27(月) 11:10:44ID:???というコードがあるんですが、何をやっているのかわからないので教えてください。
・@{$foo} は何ですか?$fooでも@fooでもないのでわかりません。
・scalar(@{$foo}) は結局何をしているんでしょうか?
0837nobodyさん
2009/07/27(月) 11:30:52ID:???$fooというリファレンスを、デリファレンスしてる
> ・scalar(@{$foo}) は結局何をしているんでしょうか?
配列の要素数を得てる
スカラーコンテキスト。
my $count = @array;
ってやると、コンテキストで要素数が得られるのと同じ。
0838nobodyさん
2009/07/27(月) 11:42:52ID:???@{$foo}
と書くのも
@$foo
と書くのも一緒だから、覚えとくといいよ。むしろ後者で書く人の方が多い気がするから。
0839nobodyさん
2009/07/27(月) 11:46:28ID:???ありがとうございます。@{$foo}と@$fooは同じなんですね。
@{$foo}なんて書き方、初めてみたんですが、これどんなときにつかうんですか。@$fooだけでいいように思いました。
0840nobodyさん
2009/07/27(月) 12:21:05ID:???Perlはいろんな書き方出来る言語だから、そんなことでいちいち疑問に思ってたら前に進まないよ
というより、@{$foo}の方が丁寧な書き方っていう印象がある。
俺がそう思うということは、たぶん、オライリーのプログラミングPerlや初めてのPerlにはそう書いてあるはず。
0841nobodyさん
2009/07/27(月) 12:35:35ID:???あくまで @{...} が基本形。{} の中はリストリファレンスを返すものなら何でもいい。
@{ ['A'..'Z'] }
@{ $flag ? $bar : baz() }
@{ $foo[1] }
${ $quux }[1]
@{ $quux }[ 1..3 ]
@{"symbolic"} # 文字列ならシンボリックリファレンス
@{bareword} # トークンなら普通の変数
{} の中が単純なスカラー変数の場合は{}を*省略*できる (そして省略する人が多い)。
…と覚えた方が、後で悩まずに済むよ。
0842nobodyさん
2009/07/27(月) 12:39:54ID:???0843nobodyさん
2009/08/07(金) 10:07:16ID:???my $head = 0x00000000; #空の4バイト確保
print (pack( "V", $head) . "\n"); #挙動がおかしいのでちょっと出力してみた
しっかり消滅してるしw
どうしればいいですか。
0844nobodyさん
2009/08/07(金) 10:27:48ID:???よくわからんがhoge.plにそのまま書き込んで実行してみた。
% perl hoge.pl |hex
0x00000000: 00 00 00 00 0a - @@@@J
ちゃんと4バイトの0が出てるので書いてるとおりの動作だな。
これで不満ならどうやって確かめて何がおかしいと思ったのか説明
してもらわないと。
0845nobodyさん
2009/08/07(金) 10:42:44ID:???俺が勝手に使ってるテキストエディタ内の新タブに出力させてたら、エディタの問題だったみたいです。
プロンプト、ファイル出力、共に4バイトありました。
0846nobodyさん
2009/08/12(水) 14:33:18ID:???use CGI::Sendmail;
my %mail = (
To => 'you@2ch.net',
Cc => 'he@2ch.net',
Bcc => 'she@2ch.net',
From => 'me@2ch.net',
Name => "ひろゆき",
Subject => "こんにちは",
Body => <<EOL,
お元気ですか?
では、さようなら
EOL
"Sendmail-path" => "/usr/sbin/sendmail",
"Character-code" => "euc-jp",
);
if ( CGI::Sendmail->new(%mail)->send ) { print "送信完了" }
else { print "送信できませんでした" }
0847nobodyさん
2009/08/12(水) 16:40:16ID:???http://search.cpan.org/dist/MailTools/
http://search.cpan.org/~markov/MailTools-2.04/lib/Mail/Send.pod
http://search.cpan.org/search?m=module&q=Mail&s=1&n=100
0848nobodyさん
2009/08/12(水) 18:05:46ID:XtZqM+tgフォームで受け取った$pass(値はhoge)と
同じくフォームで受け取った$idをファイル名に含んだファイルの二行目をfile()で読み込んで
$data[1](値はhoge)に代入して
if($pass==$data[1]){
print"値は同じです".$pass"==".$data[1];
}
else{
print"値は違います".$pass"==".$data[1];
}
を実行すると
「値は違います hoge==hoge」
と表示されるのですが「値は同じです」と表示させるにはどうしたらいいですか?
0849nobodyさん
2009/08/12(水) 18:10:12ID:???0850nobodyさん
2009/08/12(水) 18:11:08ID:???0851nobodyさん
2009/08/12(水) 18:14:13ID:XtZqM+tg0853nobodyさん
2009/08/13(木) 20:16:07ID:CNJ7rD2pprintfと書きましょうと習ったんだけど
printでも普通に使えるよね?
昔は使えなかったの?
0855nobodyさん
2009/08/13(木) 21:09:54ID:???0856nobodyさん
2009/08/13(木) 22:41:36ID:???0857nobodyさん
2009/08/13(木) 22:44:43ID:???習った>>853は、全ての場合でと勝手に解釈したってことだろ
会話で生じる誤解としては良くある例
0858nobodyさん
2009/08/14(金) 01:16:04ID:???print と sprintf だけ使ってた
びっくらこいた
0859nobodyさん
2009/08/14(金) 01:26:28ID:???こんな書き方できたのか!?って
0860nobodyさん
2009/08/14(金) 02:07:28ID:???html表示するときのフォントをverdanaにしてるんですが
そうすると半角¥がバックスラッシュで表示されてうざいので
$hoge=~ s/\\/¥/ig;
としようと考えたのですが、すると今度は特定の日本語文字が
化けてしまいます
$hogeの中の英数記号だけを変換するにはどう書いたらよいでしょうか
0861860
2009/08/14(金) 02:12:28ID:???$hoge=~ s/\\/&yen/ig;
です
0862nobodyさん
2009/08/14(金) 02:53:12ID:???0864nobodyさん
2009/08/14(金) 14:02:57ID:dh+Y7m4lバイトコードで書く
\5Cの次にS-JISの2バイト目が来なかった場合のみ置換
0866nobodyさん
2009/08/15(土) 03:55:15ID:???http://www.din.or.jp/~ohzaki/perl.htm#JP_Match
0867nobodyさん
2009/08/15(土) 11:58:25ID:???肯定の戻り読みを使って、単語の後と行の先頭のときのみを置換するようにしたらどうだろう?
$hoge =~ s/((?<=^)|(?<=[\x00-\x7F\xA1-\xDF])|(?<=[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]))\\/¥/g;
0869nobodyさん
2009/08/16(日) 14:53:02ID:???0870nobodyさん
2009/08/16(日) 15:29:10ID:???use Data::Dumper;
print @Data::Dumper::EXPORT; #=>Dumper
パスを文字列にしてアクセスする場合は、シンボリックリファレンスにするしかないですかね?
my $path = "Data::Dumper";
print @{$path."::EXPORT"}; #=>Dumper
0871nobodyさん
2009/08/16(日) 21:22:55ID:???0873nobodyさん
2009/08/17(月) 00:52:26ID:PDEfAFzM0874nobodyさん
2009/08/17(月) 01:29:56ID:???0876nobodyさん
2009/08/17(月) 02:18:26ID:???{ package $path; print @EXPORT}
package で変数使えるならいけそうだけど使えなかった記憶が…
0877nobodyさん
2009/08/17(月) 07:59:43ID:???前に一度そういうコード書いたことあるからわかる
0878nobodyさん
2009/08/17(月) 09:09:05ID:QR35H0tn0879nobodyさん
2009/08/18(火) 00:44:13ID:jmGn/Iui中身が空で返ってきます。URLは間違ってないのですが、考えられる原因は何かないでしょうか?
0881nobodyさん
2009/08/18(火) 01:17:01ID:???取りあえずこの中身見てみては?
0882nobodyさん
2009/08/18(火) 02:57:59ID:B/cB/Ta10884nobodyさん
2009/08/18(火) 12:26:05ID:???ありがちなのはUserAgentとかRefererとかCookieとかトークンで弾かれてるってパターンだな。
0885nobodyさん
2009/08/18(火) 12:34:15ID:???0886879
2009/08/18(火) 13:44:36ID:9U61OqMGこれで良いのしょうか?
my $request = HTTP::Request->new('GET',$url);
my $http = $request -> as_string();
print "$http";
GET http://headlines.yahoo.co.jp/rss/indonews_c_int.xml User-Agent: libwww-perl/5.830
>>880
よく分からないのですがどういうことでしょうか
また、はじかれるのを回避するにはどうすれば良いのでしょうか?
0887nobodyさん
2009/08/18(火) 14:25:27ID:???http://headlines.yahoo.co.jp/rss/indonews_c_int.xmlが取得したいなら、
LWP附属のGETコマンドで一発で取れるからどっかスクリプトに不具合があるんじゃ
ないかと思われ。
0888nobodyさん
2009/08/18(火) 16:40:28ID:???my $url = "http://headlines.yahoo.co.jp/rss/indonews_c_int.xml";
my $file = "./rss.xml";
my $rc = getstore($url, $file);
is_success($rc) or die status_message($rc);
こっちはこれでアクセスできてるけど。
これがダメなら、一度LWPのパッケージのバージョン上げてみて、
それでもダメなら別の角度からどうぞ。
それ以前に、ブラウザでアクセスできてるんかいな。
0889879
2009/08/18(火) 18:56:58ID:2nsUhaJf最後の行でサーバエラーが出ました…
またブラウザでアクセスは出来ます。
あとアップデートはrootでrpm -Uvh perl-libwww-perlを行って出来ませんでした。
間違いを指摘して貰えると助かります。
0890nobodyさん
2009/08/18(火) 20:17:49ID:???依存関係でcpan使いたくないのなら、別に/usr/localにソースからPerl突っ込んでみるとか。
ここまで来るとlynxかwget使って取得した方が早そうだけど。
0891879
2009/08/18(火) 22:21:49ID:2nsUhaJfcpanでinstall LWPとした所、LWP is up to date(5.830)となりました。
0892nobodyさん
2009/08/19(水) 01:47:46ID:1hmn0Zu+0893nobodyさん
2009/08/19(水) 09:37:51ID:???rpmで削除できないか?できないなら@INCから自力でLPW探して
LPWを手動で削除してもっかいcpanから入れてみろ。
0895nobodyさん
2009/08/19(水) 18:15:22ID:???perl+htmlで掲示板を作っています。PC・携帯共に基本的には正常動作するのですが、auの機種のみ
■html側(shift_jis)
<form action="bbs.cgi" method="post">
<textarea name="comment" rows=4 cols=30></textarea>
<input type=submit value=発言>
</form>
↓「あいうえお」と入力
■bbs.cgi(EUC_JP)
use CGI;
$query = CGI->new;
@params = $query->param();
foreach $param (@params) {
$in{$param} = $query->param($param);
}
↓
$in{comment}の中身は「??????????」
のような動作になってしまいます。
URLエンコード/デコードのせいかと思ったのですが、受け取り時点でこんな化け方をされるとどうすれば良いのやら……
何か解決法は無いでしょうか。
よろしくお願いいたします。
0896nobodyさん
2009/08/19(水) 21:20:51ID:???0897nobodyさん
2009/08/19(水) 22:50:25ID:???携帯向けコンテンツはShift_JIS/UTF8のどっちかで作っとくことをお勧めしとく。
■ このスレッドは過去ログ倉庫に格納されています