Perlコーディング初心者質問スレ Part 56
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2007/09/16(日) 19:49:43ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >2 以降
前スレ ttp://pc11.2ch.net/test/read.cgi/php/1180492441/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0638nobodyさん
2007/12/12(水) 17:26:25ID:BkwLyerT「」などの漢字が化けてしまうのですが、
これを化けないように工夫するにはどうすればいいのでしょうか?
0641628=632
2007/12/13(木) 20:33:46ID:???色々と検討してみた結果、速度や安全性に疑問も多いですが、とりあえずshm○○を使ってみようかなと思います。
ありがとうございました。
0642nobodyさん
2007/12/14(金) 03:20:01ID:jWEjvsMQUsteramで録画したflvをダウンロードしたくて、
http://unknownplace.org/memo/2007/10/03を参考に以下のソースを実行しました。
#!/usr/bin/env perl
use strict;
use warnings;
use AMF::Perl;
use LWP::UserAgent;
my $cid = shift || '5Fq8cQp9eHsEEknbQ22OOZniqS2xUiuz';
my $amf = AMF::Perl::Util::Object->new;
$amf->addBody('client.watch_video', '/1', { cid => $cid });
my $outputstream = AMF::Perl::IO::OutputStream->new;
my $serializer = AMF::Perl::IO::Serializer->new($outputstream, 'utf-8');
$serializer->serialize($amf);
my $amfdata = $outputstream->flush;
$amfdata =~ s/\xff\xff\xff\xff/\0\0\0\x31\x0a\0\0\0\x01/;
my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new( POST => 'http://gw.ustream.tv/gateway.php' );
$req->content( $output );
$req->content_type('application/x-amf');
$req->content_length( length $amfdata );
my $res = $ua->request($req);
my $deserializer = AMF::Perl::IO::Deserializer->new(AMF::Perl::IO::InputStream->new($res->content), 'utf-8');
use YAML;
print Dump $deserializer->getObject->getBodyAt(0)->{value};
0643642
2007/12/14(金) 03:21:23ID:jWEjvsMQContent-Length set when there is no content, fixed at /Library/Perl/5.8.6/LWP/Protocol/http.pm line 196.
Can't use an undefined value as a HASH reference at test.pl line 37.
どうすればいいでしょうか。
よろしくお願いします。
0644nobodyさん
2007/12/14(金) 08:48:00ID:???0645nobodyさん
2007/12/15(土) 20:24:19ID:???として、処理中に何らかのテキストを入力させたいです。
英数字は問題ないのですが、日本語を入力したときが変です。
aあ
と入力して、バックスペースを押すとちゃんと消去されません。2回おせば「あ」の表示は消えるのですが、
受け取った文字のaも消えてしまっています。
解決策を教えてください
0646nobodyさん
2007/12/15(土) 22:15:15ID:???新しいIPアドレスが追加されたか定期的にチェックしてるんですか?
http://ja.wikipedia.org/wiki/%E5%88%A9%E7%94%A8%E8%80%85:Tietew/%E6%90%BA%E5%B8%AF%E9%9B%BB%E8%A9%B1%E3%81%AEIP%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%83%AA%E3%82%B9%E3%83%88
0647nobodyさん
2007/12/15(土) 22:41:06ID:???@text = <STDIN>;
ってやったときに、入力を終わりにするにはどうすればいいのですか?
0648nobodyさん
2007/12/16(日) 02:59:28ID:???そこから調べてるかどうかはともかく、公式サイトを見るのは確かだな。
まあ、IPアドレスが追加されること自体はあんまり無いし……。
0650nobodyさん
2007/12/16(日) 16:00:14ID:???ホストに変換するのは失敗することあるらしいぞ。
直接IPから判断した方が確実。
気にするほどじゃないとは思うけど、どうなんだろ
0651nobodyさん
2007/12/16(日) 18:41:45ID:???0652nobodyさん
2007/12/16(日) 19:23:33ID:???0653642
2007/12/17(月) 11:34:49ID:FgX+pG+l37行目は一番最後のprintの部分です。
0654nobodyさん
2007/12/18(火) 10:34:57ID:???require('lib/lib.pl');
&dosomething();
と書いておいて、lib/lib.plに、
sub dosomething{
open(FH, '>> baka.log');
print FH time."\n";
close(FH);
}
とすると、lib/の中にファイルができるのではなく、ひとつ上にできてしまいます。
これをlib/の中に保存したいのですが、ライブラリからの相対パスで保存する方法はないでしょうか。
または絶対パスを使うしかないのでしょうか。
ヒントだけでもお願いします。
0657nobodyさん
2007/12/19(水) 01:05:36ID:???よくわからなくて試行錯誤の末下のような方法にたどり着きました
$AA{'name'} = '1234';
$BB[0]{'name'} = 'abc';
$BB[1]{'name'} = 'ああああ';
$BB[2]{'name'} = '!?';
kansuu( \%AA );
$tmp = \@BB;
kansuu( ${\$tmp->[0]} );
kansuu( ${\$tmp->[1]} );
kansuu( ${\$tmp->[2]} );
sub kansuu
{
my $h = $_[0];
print "$h->{'name'}<br>";
}
BBの要素を kansuu() に入れるために
もっとスマートな方法(っていうか正しい書式)がありましたら教えていただけないでしょうか?
0658nobodyさん
2007/12/19(水) 01:14:31ID:???my @BB = (
{name => 'abc'}, #$BB[0]に無名ハッシュ(リファレンス)をいれる
{name => 'ああああ'}, #$BB[1]に〃
{name => '!?'} #$BB[2]に〃
);
kansuu( \%AA ); #\をつけることで%AAのリファレンスがわたる
kansuu( $bb[0] ); #$bb[0]の無名ハッシュリファレンスを渡す
kansuu( $bb[1] );
kansuu( $bb[2] );
sub kansuu {
printf('%s<br>',shift->{name});#ハッシュリファレンスは->をつけて要素を取り出す
}
0659nobodyさん
2007/12/19(水) 02:00:39ID:???正直スカラーのリファレンスの説明は自身がないけどおよそあってると思う
my $scalar = 'abc'; #スカラー
my $scalar_ref = \$scalar; #スカラーのリファレンス
my $anon_scalar_ref = \do {my $anon;}; #微妙に無名じゃないけど
my @array = (1,2,3); #配列
my $array_ref = \@array; #配列のリファレンス
my $anon_array_ref = [1,2,3]; #無名配列のリファレンス
my %hash = (a=>1,b=>2,c=>3); #ハッシュ
my $hash_ref = \%hash; #ハッシュのリファレンス
my $anon_hash_ref = {a=>1,b=>2,c=>3}; #無名ハッシュのリファレンス
my $slacar_object = bless $scalar_ref => __PACKAGE__; # スカラー使ったオブジェクト
my $array_object = bless $array_ref => __PACKAGE__; # 配列使ったオブジェクト
my $hash_object = bless $hash_ref => __PACKAGE__; # ハッシュ使ったオブジェクト
#素直に取り出せる
printf "scalar=%s\n",$scalar;
printf "array=%s\n",$array[0];
printf "scalar=%s\n",$hash{a};
#アドレスっぽいのがとれる
printf "scalar_ref=%s\n",$scalar_ref;
printf "array_ref=%s\n",$array_ref;
printf "scalar_ref=%s\n",$hash_ref;
#リファレンス先の値書き換えたり取り出したり
$$scalar_ref = '書き換えちゃった';printf "scalar=%s\n",$$scalar_ref;
$array_ref->[1] = '書き換えちゃった';printf "array=%s\n",$array_ref->[1];
$hash_ref->{b} = '書き換えちゃった';printf "scalar=%s\n",$hash_ref->{b};
#デリファレンスする(copyが作られる)
my $scalar2 = ${$scalar_ref};
my @array2 = @{$array_ref};
my %hash2 = %{$hash_ref};
0660nobodyさん
2007/12/19(水) 07:53:49ID:???↓これを出力したいのですが・・・
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
ttp://www.geocities.co.jp/SiliconValley-Sunnyvale/6128/perl/cgipm.html
このページの解説によると、
use CGI;
my $q = CGI->new;
print $q->start_html(
-head=>meta({'http-equiv' => 'Content-Type'
-content=>"text/html; charset=$CharSet"}
),
このようなコードになるはずなのですが、やってみると
Undefined subroutine &main::meta called
というエラーがでます。meta()がメインのサブルーチンだと解釈されてるみたいです。
0661660 続き
2007/12/19(水) 07:54:19ID:???-head=>$q->meta({'http-equiv' => 'Content-Type'
-content=>"text/html; charset=$CharSet"}
),
とやると一応うまくいくのですが、なぜか
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
このようにもう一つ余計なメタが出てしまいます。どうすればいいのでしょうか?
CGI.pmは3..31です。
0662nobodyさん
2007/12/19(水) 10:23:45ID:???http://perldoc.jp/docs/modules/CGI.pm-2.89/CGI.pod
my $q = CGI->new;
$q->charset('UTF-8');
0664657
2007/12/20(木) 08:31:41ID:???ありがとうございます!
超わかりやすくて助かりました
今のプログラムの色んなところがもっと簡潔に書けそうです
0665nobodyさん
2007/12/20(木) 10:28:40ID:???> 今のプログラムの色んなところがもっと簡潔に書けそうです
本当はわかってないくせに。
0667nobodyさん
2007/12/20(木) 13:39:25ID:???0668nobodyさん
2007/12/20(木) 16:21:00ID:???0669nobodyさん
2007/12/21(金) 21:13:42ID:???めんどいけど。
0670nobodyさん
2007/12/22(土) 18:50:11ID:???0671nobodyさん
2008/01/02(水) 06:47:19ID:???0672nobodyさん
2008/01/02(水) 20:07:21ID:???依存コードは書いてないけど
0673nobodyさん
2008/01/03(木) 00:16:04ID:???cygwinで5.10入れてみた
use 5.10;で書いてみてる
0674nobodyさん
2008/01/05(土) 22:21:41ID:???$test = "今日は\n いい天気です $wether";
こんな変数があるとして、$test自体は展開してほしいんですが、
中身の\nや$wetherは展開せずに出力したいのです。
0675nobodyさん
2008/01/05(土) 22:58:36ID:???ちなみに、weather?
0676nobodyさん
2008/01/06(日) 03:58:05ID:???$testに代入した時点で展開しちゃってるでそ
そもそも確認したい意図は何?
リファレンスにしてアドレスを確認する手もあるけど
0677674
2008/01/06(日) 14:08:20ID:???>>675
そうです;
>>676
なるほど・・・
意図は正規表現でゴチャゴチャいじったあとの文字列が
どうしてもめちゃくちゃくになってしまうので、変数の位置関係を調べたかったのです。
0678nobodyさん
2008/01/06(日) 16:36:10ID:???それが答えじゃないか。
>>676はそれもわかってないみたいだが。
0679nobodyさん
2008/01/06(日) 23:12:25ID:wcb81UNaprint "$kekka";
このような計算をしたら、結果が57になりました。
intって小数点が発生した時に切り落とすはずですよね?
えと、なぜこんなことになるのか意味が分からないのですが、
誰かご教授お願いします
0680nobodyさん
2008/01/07(月) 01:59:09ID:???http://www.tt.rim.or.jp/~rudyard/torii009.html
0681nobodyさん
2008/01/07(月) 11:17:24ID:???語源の知識としてはありだけど、誤用が定着するなんていくらでもあることだから。
いつもいつも空気読めない人が指摘するよな。
0682nobodyさん
2008/01/07(月) 11:27:36ID:???$kekka = int(((my $n=200 * 0.29)=~/(.*)/)[0]);
print "$kekka";
こう書けばOK
0684nobodyさん
2008/01/07(月) 11:38:36ID:???ので、その結果を書いておく。
何でこんな風な結果になるのだろうか。私も分からなかった。
$kekka = 200 * 0.29;
print "$kekka";
出力:58
$kekka = 200 * 0.29;
$kekka = int($kekka);
print "$kekka";
出力:57
$kekka = int(200 * 0.29);
print "$kekka";
出力:57
$kekka = int(2 * 29);
print "$kekka";
出力:58
0685nobodyさん
2008/01/07(月) 12:30:31ID:???use bignum; これで解決。
0686nobodyさん
2008/01/07(月) 21:15:48ID:XSyaqzwgおぉ いきました!
詳しい原因はよくわからないですが、ありがとうございました。
0687nobodyさん
2008/01/07(月) 21:22:49ID:???(* 200 0.29)
ってしてみたら57.99999999999999だってさ。機械の計算って難しいことがあるな
0688nobodyさん
2008/01/07(月) 22:41:02ID:???0689nobodyさん
2008/01/07(月) 22:44:33ID:???0690nobodyさん
2008/01/07(月) 23:59:36ID:???少なくとも俺は浮動小数点の丸め誤差については習ったことない。
あと高校の世界史も。
0692nobodyさん
2008/01/08(火) 00:31:05ID:k+nta2fcコンピュータの中で200*0.29ってどうやって計算してるか分からない
そもそも結果が57.9999・・・・になると言われても、どういう計算をしているのか
さっぱりw
0693nobodyさん
2008/01/08(火) 00:34:28ID:???(* 20 0.29)
これは5.8って表示されるから困るw
0694nobodyさん
2008/01/08(火) 00:38:53ID:???0696nobodyさん
2008/01/08(火) 08:15:35ID:???wikipediaにも載ってたね。
問題の解決には、 use bignum; つかえばいいわけで、それでいい
のは分かるけれど、それとは別の話で、小数を100倍して整数で演算をして、
あとで100で割ったりする方法だったらちゃんとでるから
use bignum; しなくてもいいんだよね?
0697nobodyさん
2008/01/08(火) 22:01:08ID:???0.29が有効数字2桁だとあらかじめ分かっているなら100倍すればいいけどなあ。
既知でないときにはuse bignum;じゃないか?
0698nobodyさん
2008/01/09(水) 00:10:32ID:???レスサンクス。
いや、意味の無い部分の考えかなと思ったんだけど、
そっちの方がメモリが少なくて済み、処理が早くなったりするのかなとか
思ったのよね。ま、すごく小さな世界をいっているんだろうけれど。
0699nobodyさん
2008/01/09(水) 01:01:57ID:???俺は細かい実行時間を気にしてミスをするより、コードの可読性を優先したいな。と思った。
大量のデータを扱う人から見ればふざけた態度かもしれないけどね。
0700nobodyさん
2008/01/09(水) 02:01:45ID:???0701nobodyさん
2008/01/09(水) 03:08:01ID:480klIK20702nobodyさん
2008/01/10(木) 23:51:33ID:???サブネットマスク形式のリストをマッチングさせたいんですが、
どんなループさせればいいですかね?
#判定ルーチン内
foreach (@list) {
my ($min,$max) = subnetMinMax($_);
return ($ip >= $min and $ip <= $max) ? 1 : 0;
}
としてるんですが、grep等を使ったほうが良いんでしょうか?
ループ内でサブルーチン呼ぶのがちょっと気になります。
0703nobodyさん
2008/01/11(金) 00:04:09ID:???x: return ($ip >= $min and $ip <= $max) ? 1 : 0;
o: return 1 if($ip >= $min and $ip <= $max);
0704nobodyさん
2008/01/11(金) 11:44:26ID:???何にマッチしたか全て取りたいならgrepだけど
有るか無いかだけでいいならループ回して見つけ次第結果返していいんじゃない?
0705nobodyさん
2008/01/11(金) 16:30:20ID:???0706nobodyさん
2008/01/11(金) 20:31:41ID:???なるほど。このままにしますありがとうございました。
>>705
そっか、そうですよね。
聞いてみて良かったです。
0707nobodyさん
2008/01/12(土) 13:10:11ID:???「うんこ」の前後は英数字・日本語交じりで文字数は不定です。
$_ =~ s/(うんこ)/$1でる/;
だと、うんこ〜出るの間の文字が文末にきてしまいます。
文末指定は$みたいなので
$_ =~ s/(うんこ)/$1でる$/;
としてperlを実行させると、エラーなのか、プログラムが終わりません。
0708nobodyさん
2008/01/12(土) 13:13:01ID:???$うんこ .= ’でる’
}
0709nobodyさん
2008/01/12(土) 13:38:43ID:???if (index($_, 'うんこ') >= 0){ $_=~ s/$/でる/; }
0710707
2008/01/12(土) 13:54:47ID:???全角を半角にしてやってみたりしましたが、エラーでした。
>>709
できました。ありがとうございます。
ただ、>=0の意味が分かりません。
改行は\nじゃないんですか?
0711nobodyさん
2008/01/12(土) 18:35:26ID:???0714nobodyさん
2008/01/13(日) 13:16:41ID:rzzkvCmjエロエロ言語だの
言うけどさ
俺が習ってきた主な4つの言語のなかじゃ
間違いなく一番習得が苦しかった
ぞ
つまり、学習コストは高い
Perlより習得が難しい言語ってあるの?
私見では達人レベルを目指すならC++が全言語のなかで一番習得困難
そこそこのプロレベルを目指すならPerlが一番困難(C++はそこそこのプロならまだ簡単)
0715nobodyさん
2008/01/13(日) 13:17:19ID:rzzkvCmj0716nobodyさん
2008/01/13(日) 21:52:12ID:???変数名のつけ方で悩んでいます。
たとえば、
my $title;
my $script_content_title;
my $ScriptContentTitle;
sub param{}
sub parse_URL_encoded_string{}
sub ParseURLEncodedString{}
等、色々書き方ありますが
短い方が良いのか、わかりやすい名前が良いのか、
又、大文字、小文字を混ぜて使うべきか、覚えやすい名前にするべきか、
意見ください。
賛否両論あると思いますが、極力万人受けするものを選びたいです。
長文すみません
0717nobodyさん
2008/01/13(日) 21:53:50ID:???0719nobodyさん
2008/01/13(日) 22:43:42ID:???0720nobodyさん
2008/01/13(日) 23:03:26ID:???かというところもあるからな。
例えば、関数名で html_ をつけるとそうでないものとの区別がついて
分かりやすくなるけれど、全部の関数に html_ がついてたら
逆に無意味に長いだけとなる。
ここでアドバイスが欲しかったら、その書こうとしているプログラムや
ソースをもう少し具体的にだすとかしないと話は進まないと思う。
0721716
2008/01/13(日) 23:22:17ID:???ありがとうございます。全部読みました。
基本的にはアンダースコアを使うべきだそうです。
スコープによって使い分けるのが良いみたいですね。
$Global_Data #グローバル
$tmp #局所
$LOCK_KIND #定数
>>720
プログラムの種類によって書き方が変わる、変えられるのがperlの利点かもしれませんね。
>全部の関数にhtml_
そういうのはパッケージにまとめればOKですかね。
おかげ様で書き方が頭に浮かんできました。ありがとうございました。
0722nobodyさん
2008/01/14(月) 02:09:11ID:???でもPerlプログラマは"傲慢"なので他人のコーディングスタイルを気にしません。
こんなイメージ。
0723nobodyさん
2008/01/14(月) 02:26:48ID:???ネーミング重要。(高橋メソッド風に)
でも職人芸的なところあるよねネーミングセンスって。
なかなかそこは難しい。
0724nobodyさん
2008/01/14(月) 04:10:53ID:???0725nobodyさん
2008/01/14(月) 04:15:16ID:???もう解決したみたいだけど、Perlベストプラクティスもおすすめ
ダミアン先生の盲信はいけないけど、かなりためになるYo
0726nobodyさん
2008/01/14(月) 17:41:01ID:???一般論としては、上を目指すならいろんなハッカーのコードや文章にたくさん触れることが必要。
これがなかなか大変だし難しい。
そのためにはネット上のコミュニティーやリアルのイベントにこまめに参加したり
ブログを定期的にチェックし続けないといけないから。
そういうことをしてない自称Perl使いが結構俺の周りにはいて、
そういう奴らは我流のあまりエレガントじゃないスタイルから抜け出せないでいる。
0727nobodyさん
2008/01/14(月) 18:57:12ID:4AKnbZN2メタ字が混ざっていることもあり、ちゃんと出力できません。
あらかじめファイルの中のメタ字に\を振って置くとしても、かなりの手間になりそうですし、
何か効率の良いメタ字対策はないでしょうか?
0728727
2008/01/14(月) 19:02:23ID:4AKnbZN2ファイルに入っている文字からの出力の際の
文字化けする文字の対策をお願いします。
0729716
2008/01/14(月) 20:00:43ID:???オライリーファンの俺には最高の本かもです。
>>727-728
余計な事してるからじゃないですかね?
quotemetaなんてのはどうですか?
文字コードなんかも書くと返事もらえるかも。
0730nobodyさん
2008/01/14(月) 20:08:53ID:???情報不足です。
「ファイルに入っている文字」…どんな文字? 文字コードは何?
「出力するつもり」…どこに出力するの?
「メタ字」…具体的にどの文字ですか?
「ちゃんと出力できません」…具体的にどのように出力できないのですか?
ありがちなのは、ファイルの中と、コンソールの文字コードの設定が異なっていて、文字化けしたように見えるとか。
メタ文字をいったん解釈してしまっているとか。
ヌル文字とかタブとか垂直タブとかグループセパレータとかasciiの制御コードはそもそも「文字」ではないですし。
「文字」をどう「出力」したいのかにもよります。
コードを示してはどうですか。
0731727
2008/01/14(月) 20:18:57ID:4AKnbZN2while($list = <IN>){
(undef,$name[$i],undef) = split(/:/, $list);
$i++;
}
@name = sort(@name);
while($line = <@name>){
print "<option value='$line'>$line</option>";
}
えーっと、コードはこのような感じです。
ファイルのDBにアクセスして、その中の一部を取り出しソートしてhtmlで出力するという形です。
0732nobodyさん
2008/01/14(月) 20:21:10ID:???0733nobodyさん
2008/01/14(月) 20:23:30ID:???html中で使われてる文字コードと出力してる変数の文字コードの不一致とか…
0735727
2008/01/14(月) 20:32:56ID:???ファイルをその後書き換えたりするとそれも出来なくなるのではないかと思っております。
0736nobodyさん
2008/01/14(月) 20:40:00ID:???0737nobodyさん
2008/01/14(月) 20:46:05ID:???use utf8;
binmode STDIN, ':encoding(shiftjis)';
binmode STDOUT, ':encoding(shiftjis)';
# windowsなら shiftjis -> cp932
↑やってみて
ソース中に日本語文字列書くならutf8で保存してね。
0738nobodyさん
2008/01/14(月) 20:54:55ID:???binmode IN, ':encoding(shiftjis)';
かな?
■ このスレッドは過去ログ倉庫に格納されています