Perlについての質問箱 30箱目
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2007/03/14(水) 22:54:12"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板 http://pc8.2ch.net/php/ )
CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。
http://www.perl.org/get.html
● 2006/12/21現在の最新版: 5.8.8
● 2006/12/21現在の開発版: 5.9.3
前スレ
Perlについての質問箱 29箱目
http://pc11.2ch.net/test/read.cgi/tech/1166708139/
リンク集は>>2-3
過去スレは>>4
0049デフォルトの名無しさん
2007/03/20(火) 16:13:480050デフォルトの名無しさん
2007/03/20(火) 16:17:42いろいろあるだろうけど、コードの再利用で量を減らすとか、
容量の大きい配列は、他の変数への複製を一切せず、全て
参照等で解決するとか。
0051デフォルトの名無しさん
2007/03/20(火) 16:21:240052デフォルトの名無しさん
2007/03/20(火) 16:35:110053デフォルトの名無しさん
2007/03/20(火) 18:44:580054デフォルトの名無しさん
2007/03/20(火) 18:53:15例えばソケットを作ってから新規スレッドを作った場合、ソケットも2つ存在し、
my $sock = IO::Socket::INET - > new(attributes);
my $thread = threads -> create(\&example);
$thread -> detach;
$sock -> close();
この場合、生成されたスレッドからはまだソケット利用できるということでしょうか?
ソケットの実体がいまいち掴めてないので余計に混乱してしまいました・・・
0055デフォルトの名無しさん
2007/03/20(火) 20:04:040056デフォルトの名無しさん
2007/03/20(火) 20:32:31配列をサブルーチンへ渡したりサブルーチンから返したりする場合に、
複数の配列ではなく(1つのリストにまとめられる心配がない)、
大きくもない配列の場合だったら、
そのまま渡したり返したりした方が
ほとんどパフォーマンスが変わらない上にコードの見通しが良くなったりしますか?
0057デフォルトの名無しさん
2007/03/20(火) 20:43:08再度勉強してきます。有難うございました。
0058デフォルトの名無しさん
2007/03/20(火) 22:10:03???
一つのリストにまとめられない心配がない、じゃなくて?
0059デフォルトの名無しさん
2007/03/20(火) 22:44:25そりゃあ使わないで済むなら、リファレンスなんて使わないほうがシンプルになるだろうね。
でも、後で「やっぱり大きな配列を扱うようにしたい」とか「複数の配列を受け取りたい」とか
思った時の事を考えると、あらかじめリファレンス受け取りにしといた方が、少ない変更で済んで
互換性を保ちやすいのは確かだと思うよ。
006050
2007/03/20(火) 23:00:32先のメモリ最適化は、perlみたいな高級言語(BASICとか)では
できる事には限界があるでしょね。
メモリの解放だってできないすぃ。いかに使わないか、なのかな。
006156
2007/03/21(水) 07:11:38自分の書き方がまどろっこしくてごめんなさい
●複数の配列ならまとめられてしまうので、リファレンスのリストで渡す・返すのは必須
●考えていたサブルーチンでは、複数の配列を渡さない・返さない
= リストがまとめられる心配がないので、リファレンスを使わず無精でウマー
と考えていました
>>59-60
サンクスです
短期的には何はともあれプロファイラで見るか、という勢いだったのですが、
中長期的な視点も大事ですね
ループで回しているようなサブルーチンだとかだと、
塵も積もれば……にもなりそうですので、節約することにします
0062デフォルトの名無しさん
2007/03/21(水) 14:03:20プロセス間通信を使うのがいいんじゃないかな。
モジュールを呼び出して実行するプロセスを一つ立ち上げて、
他のプロセスはこのプロセスと通信して実行結果をもらうようにする。
0063デフォルトの名無しさん
2007/03/21(水) 14:07:03MP3::InfoモジュールがどうもShiftJISを想定してないのかどうかは知りませんが、
とにかくID3v1(エンコードはShiftJIS)で曲名など、日本語を含んだ文字列を取得すると
utf8フラグを持っているのに中身はShiftJISという訳の分からない文字列が出ます。
そしてGuessでfrom_toでutf8に変換しようとすると、
iso-8859-1 or utf8 at C:/Perl/lib/Encode.pm line 186
上記のエラーで止まってしまいます。Jcodeのgetcodeでもutf8と判別されました。
これを、通常のShiftJISの文字列にするにはどうすれば良いでしょうか。
ID3v1にShiftJIS以外の文字列が入るかどうかは置いといて、
色々やって通常のShiftJISの文字列にしようと試みたのですが、
激しい文字化けに見舞われたり、だめでした。
どうか、お力をお貸しいただけませんでしょうか。宜しくお願いします。
0064デフォルトの名無しさん
2007/03/21(水) 14:54:56書いてあるから
006563
2007/03/21(水) 15:08:22すみません、英語は正確に読めません。
フィーリングで適当にイグザンプルを斜め読みして書いてます。
use_mp3_utf8() の事でしたら、違います。
確かにこれでShiftJISは治るのですが、
Unicodeが全部"?"に変換されてしまいます。
0066デフォルトの名無しさん
2007/03/21(水) 15:24:47shiftjisにutf8フラグが付いてるだけじゃないの?
006763
2007/03/21(水) 15:41:15その通りだと思うのですが、
_utf8_off、encode、decode等してみたのですが
全て化け化けの結果が返ってきたのです…
0068デフォルトの名無しさん
2007/03/21(水) 16:19:55英語を勉強しろよ。
別のモジュールを使おうとしたときに同じような目に遭うぞ
0069デフォルトの名無しさん
2007/03/21(水) 17:58:000070デフォルトの名無しさん
2007/03/21(水) 18:34:37Rubyでもモジュールの内臓を引き摺り出して書き換える必要があったけど。
0071デフォルトの名無しさん
2007/03/21(水) 21:42:27お約束の「はまり」だ。自力で頑張ってくれ。
例のごとく「PODを読め」とかほざいているやつは、Jcode使えとか言ってるバカと同様
八割方テメエでもできないから心配することはない。
ちなみに、あんたが既に挙げている材料だけでうまくいくよ。
007263
2007/03/21(水) 22:28:13もうかなり悩んでるんです…
挙句の果てにはUnicode文字が含まれてたら
_utf8_off で普通の文字列にし、それ以外はShiftJISとしてutf-8にエンコードしてます。
本当にお願いします…コードをいくつか書いて頂ければ…
0073デフォルトの名無しさん
2007/03/22(木) 00:07:550074デフォルトの名無しさん
2007/03/22(木) 04:24:32掲示板に貼られる画像のサニタイジングをしたいのですが、CPANか
どこかにコードがなかったでしょうか。とりあえずJPEGとPNGだけでも
処理できたらいいのですが。
0075デフォルトの名無しさん
2007/03/22(木) 05:05:440076デフォルトの名無しさん
2007/03/22(木) 08:35:230077デフォルトの名無しさん
2007/03/22(木) 08:43:350079デフォルトの名無しさん
2007/03/22(木) 16:11:560080デフォルトの名無しさん
2007/03/22(木) 17:12:58これがエラーになるのですが考えられる原因はなんでしょうか?
0081デフォルトの名無しさん
2007/03/22(木) 17:22:22・useしてない
・モジュールが無い
・ブラウザで表示してるのにContentヘッダを出力してない
・脳内鯖にしかアップしてない
とりあえずエラーログ見ればいいと思う
0082デフォルトの名無しさん
2007/03/22(木) 17:44:290083デフォルトの名無しさん
2007/03/22(木) 17:55:050084デフォルトの名無しさん
2007/03/22(木) 18:03:420085デフォルトの名無しさん
2007/03/22(木) 18:03:460086デフォルトの名無しさん
2007/03/22(木) 18:14:190087デフォルトの名無しさん
2007/03/22(木) 18:28:020088デフォルトの名無しさん
2007/03/22(木) 19:39:440089デフォルトの名無しさん
2007/03/22(木) 19:43:350090デフォルトの名無しさん
2007/03/22(木) 20:24:23正規表現で伸ばし棒を使うとエラーが出てしまうのですがこれを回避する方法はないでしょうか?
よろしくお願いいたします
0091デフォルトの名無しさん
2007/03/22(木) 20:25:370092デフォルトの名無しさん
2007/03/22(木) 20:26:57これです
0093デフォルトの名無しさん
2007/03/22(木) 20:27:490094デフォルトの名無しさん
2007/03/22(木) 20:30:15具体的にエラーがでる正規表現と、エラーの文も書いてくれ
0095デフォルトの名無しさん
2007/03/22(木) 20:33:42my $str = "test";
$str =~ s/ニート//;
Unmatched [ in regex; marked by <-- HERE in m/ニー <-- HERE ト
and Settings\\デスクトップ\httpd142p\test.pl line 3.
こんな感じです
>>93
>>90=>>92です
0096デフォルトの名無しさん
2007/03/22(木) 20:34:122バイト目が [ になってるんでperlが混乱してるんだな。
0097デフォルトの名無しさん
2007/03/22(木) 20:37:10\Q\Eで囲め
0098デフォルトの名無しさん
2007/03/22(木) 20:40:14!!!!!
できました!!ありがとうございます!!!
0099デフォルトの名無しさん
2007/03/22(木) 21:22:200100デフォルトの名無しさん
2007/03/22(木) 21:33:380101デフォルトの名無しさん
2007/03/22(木) 21:52:35>>98は黙って>>10に書いてある通りのことをやれ。
0102デフォルトの名無しさん
2007/03/22(木) 21:53:250103デフォルトの名無しさん
2007/03/22(木) 22:08:34use strict;
use LWP::Simple;
use XML::Simple;
my $api = 'http://d.hatena.ne.jp/exist?mode=xml&url=';
my $url = 'http://www.yahoo.co.jp/';
my $document = LWP::Simple::get($api.$url)
or die "cannot get content from $url";
my $parser = XML::Simple->new;
my $data = $parser->XMLin($document);
print $data->{count}->{bookmark}->{content}, "\n";
http://www.itmedia.co.jp/enterprise/articles/0702/26/news011.html
ここのサンプルなんですがエラーがでました
何が悪いのでしょうか?そんなに難しいことをやってるわけではないと思うのですが
0104デフォルトの名無しさん
2007/03/22(木) 22:40:110105デフォルトの名無しさん
2007/03/22(木) 22:45:190106デフォルトの名無しさん
2007/03/22(木) 22:48:420107デフォルトの名無しさん
2007/03/22(木) 22:48:48>エラーが出たらエラーをそのままコピペしろ
と入れた方がいいね。
>>105
コマンドラインで実行した結果を出せよ。出せないなら、WebProg逝き。
0108デフォルトの名無しさん
2007/03/22(木) 22:56:48コピペした括弧が全角でした
なんで括弧だけ全角なのか意味不明です
わざとなんでしょうかね
ひどいサンプルです
0109デフォルトの名無しさん
2007/03/22(木) 23:02:580110デフォルトの名無しさん
2007/03/22(木) 23:05:47手を動かして理解するためのコードだとは思うが、なんで括弧が半端
に全角になってるんだろうな。(9行目の2つと13行目の閉じ括弧)
0111デフォルトの名無しさん
2007/03/22(木) 23:35:370112デフォルトの名無しさん
2007/03/22(木) 23:37:14一致するファイルの一覧)を配列に取得したいのですが相手サーバの設定の関係で
wgetとやらを使って接続しないといけません。
wgetの使い方は調べてみたのですが、それをPerlから実行してファイル一覧を取得
するにはどうやったらよいのでしょうか?
0113デフォルトの名無しさん
2007/03/22(木) 23:44:57どんな内容が返ってくるかは実際に見てみれ。
0114デフォルトの名無しさん
2007/03/23(金) 00:07:22サニタイジングなんて言ってたら高木大先生に張り倒されるぞ!
0115デフォルトの名無しさん
2007/03/23(金) 00:43:28思うのだが、wget使わないと取れないってどういう仕掛けなのだろう??
0116デフォルトの名無しさん
2007/03/23(金) 02:01:060117デフォルトの名無しさん
2007/03/23(金) 07:36:19ありがとうございます。やってみます。
>>115-116
Net::FTPで作ってたのですがこれだと相手に繋がらなくて客先の担当の方が
「wget使ってください」とのことでした。
0118デフォルトの名無しさん
2007/03/23(金) 08:57:31原因はわかってるのかな。それともwgetだと実績あるから
調べるの面倒だしそれにしとけとあしらわれたか?
0119デフォルトの名無しさん
2007/03/23(金) 09:41:38全てのa要素のhref属性値をzzzwww.html というファイルに出力する方法を教えてください。
0120デフォルトの名無しさん
2007/03/23(金) 09:56:38passiveコマンド叩けば通るとかいうオチだったりして……
0121デフォルトの名無しさん
2007/03/23(金) 10:23:13突然だねぇ・・・
0122デフォルトの名無しさん
2007/03/23(金) 10:24:01ググレカス
http://module.jp/blog/monday_module_HTML-LinkExtor.html
0123デフォルトの名無しさん
2007/03/23(金) 17:56:12javascript:a=document.getElementsByTagName('a');b='';for(i=0;i<a.length;i++)b+=a[i].href+'<br>';document.write(b);
0124デフォルトの名無しさん
2007/03/26(月) 16:19:01pasv() しても駄目か?
ファイヤーウォールがある場合は passive mode にしないと駄目なことがあるぞ。
0125デフォルトの名無しさん
2007/03/28(水) 11:20:00リファレンスを引いても載ってないし...。
0126デフォルトの名無しさん
2007/03/28(水) 11:49:020127デフォルトの名無しさん
2007/03/28(水) 11:54:00下記(*)の$_の手前にあるヤツなんですが・・
# CSV形式の $line から値を取り出して @values に入れる
{
my $tmp = $line;
$tmp =~ s/(?:\x0D\x0A|[\x0D\x0A])?$/,/;
@values = map {/^"(.*)"$/ ? scalar($_ = $1, s/""/"/g, $_) : $_} …(*)
($tmp =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g);
}
Perlメモ
http://www.din.or.jp/~ohzaki/perl.htm#CSV2Values
0128デフォルトの名無しさん
2007/03/28(水) 12:05:150129デフォルトの名無しさん
2007/03/28(水) 12:12:490130デフォルトの名無しさん
2007/03/29(木) 01:14:28デフォルトでは数値として扱われてしまい、1になってしまいます。
キャストの方法を調べたけど思うような情報が得られません。
もうしわけありませんが、教えていただけないでしょうか。
0131デフォルトの名無しさん
2007/03/29(木) 01:41:020132デフォルトの名無しさん
2007/03/29(木) 08:07:32ウチの環境下だと、普通に文字列認識なんだが変数かなんかに突っ込んで、
計算かましたりしてない?
% perl -le 'print substr qq{00001}, 3'
01
% perl -le 'print unpack qq{x3A2}, qq{00001}'
01
0133デフォルトの名無しさん
2007/03/29(木) 08:08:160134デフォルトの名無しさん
2007/03/29(木) 08:27:210135デフォルトの名無しさん
2007/03/29(木) 14:13:360136デフォルトの名無しさん
2007/03/29(木) 19:40:09のような文字列があった場合
○○の温度は10度の"10"を取得したいのですが、
どのように正規表現を書けばいいんでしょうか。
$value =~ /([0-9]+)/ のようにすると $1=2007 となりますが、
最大マッチしたうちのn番目を取得できたりする書き方があるんでしょうか
例がちょっとあれですが、○○には同じワードが入ることを想定してます。
0137デフォルトの名無しさん
2007/03/29(木) 19:42:390138デフォルトの名無しさん
2007/03/29(木) 19:57:25print "$word[3]\n";
汚くなったけど、上記のようにしてなんとかできました。失礼しました。
0139デフォルトの名無しさん
2007/03/29(木) 20:08:050140デフォルトの名無しさん
2007/03/29(木) 20:10:400141デフォルトの名無しさん
2007/03/29(木) 20:28:37君は著しく成長できたということだ。
0142デフォルトの名無しさん
2007/03/29(木) 20:45:580143壁|・ x ・)つ○
2007/03/29(木) 22:09:200144デフォルトの名無しさん
2007/03/30(金) 12:21:03そんなこと言うなよ
0145デフォルトの名無しさん
2007/03/30(金) 17:55:55俺が還暦を迎えた頃にはスゲーことになってると思うんだ。
0146デフォルトの名無しさん
2007/03/30(金) 21:01:15sub get_fields {
() = \%{$_[0].'::FIELDS'};
return \%{$_[0].'::FIELDS'};
}
「() =」これって何してるんでしょう?
perl5.003で動作するように書き換えられないかな?
0147デフォルトの名無しさん
2007/03/30(金) 21:06:28コメントで「『タイポじゃねーの警告』は黙れ」と書いてあるだろ。
つまりその部分は動作とは無関係。
しかし5.003とはまた随分古いバージョンだな。せめて5.005あたりにしとけよ…。
0148デフォルトの名無しさん
2007/03/30(金) 22:23:03すまん。
エラー書いてなかった。
Can't modify stub in list assignment at /path/to/base.pm line 43, near "};"
こんなのが出る。
> しかし5.003とはまた随分古いバージョンだな。せめて5.005あたりにしとけよ…。
大人の事情というやつで・・・。
■ このスレッドは過去ログ倉庫に格納されています