- 1 名前:nobodyさん mailto:sage [2011/09/09(金) 18:11:49.71 ID:???]
- Perlのコーディングで困ってる人のスレです。
【投稿する際の注意】 質問するときは内容をよく吟味してから投稿してください。 「コマンドの意味がわかんない」とかはマニュアル見ましょう。 回答者さんは何でも屋じゃありません。 1: 自分はこういう事がしたい。 2: それでこんな風にやってみたが・・・ 3: こんなエラーが出て上手く行かなかった。 最低でも1と3が無いと誰も答えられないよ。 良い回答は良い質問から。一緒に勉強しましょう。 お勧めサイトは >>2 以降 前スレ hibari.2ch.net/test/read.cgi/php/1295170172/
- 239 名前:nobodyさん mailto:sage [2011/10/24(月) 13:58:00.35 ID:???]
- 同じプログラムをRubyとPHPとPythonでは書き直せるんですけど、
Perlだけ作法が全然違うからわかわからないんですけど、どうすればいいですか?????????
- 240 名前:nobodyさん mailto:sage [2011/10/24(月) 15:33:37.66 ID:???]
- Perl5.14でその配列が既に存在していれば、
use v5.14; push $h{$i}, "aaa"; でいけるかな?
- 241 名前:nobodyさん mailto:sage [2011/10/24(月) 17:29:05.68 ID:???]
- >>239
全然違うってほどのもんじゃないとは思うけど。 例えばどんなところが書き直せないの?
- 242 名前:nobodyさん mailto:sage [2011/10/24(月) 19:39:40.90 ID:???]
- むしろその中だと、PHP←→Perlが一番簡単な気がするんだw
- 243 名前:nobodyさん mailto:sage [2011/10/24(月) 23:41:27.27 ID:???]
- >>241
ハッシュとか配列とかの操作でカッコとか記号とかが覚えられない。 代入するときも表示するときもアクセスの仕方が違ったりして覚えられない。ダンプするのも一苦労。 クラスのnewのblessとか未だに何なのかわからない。祝福とは??? リファレンスとかスカラーとかレキシカルとか聞き慣れない用語ばかり出てくる。 スコープとかクロージャとかJavaScriptの悪夢がよみがえる。 とにかく記号ばっかりで暗号いじってるみたいな意味不明さが怖い。 $hoge; $hoge{0}; $hoge->{0}; @hoge; @hoge{0}; @hoge->{0}; %hoge; %hoge{0}; %hoge->{0}; ${$hoge}; @{hoge}; @{$hoge}; {@{$hoge{0}}} @{$hoge->[0]}; %{$hoge->[0]}; %{$hoge->{0}} どれだよ!!!!!!!!111111111
- 244 名前:nobodyさん mailto:sage [2011/10/24(月) 23:51:16.92 ID:???]
- 独特の表記とか用語に拒否反応ってのはわからんでもないけど、
スコープとかクロージャ駄目ってんじゃ他の言語もまともに使えてないだろ……
- 245 名前:nobodyさん mailto:sage [2011/10/24(月) 23:54:49.09 ID:???]
- >>243
意味不明って、単にPerlを知らないだけでは。 慣れればおいしいよ。
- 246 名前:nobodyさん mailto:sage [2011/10/25(火) 00:14:38.50 ID:???]
- $hoge; スカラ
$hoge{0}; ハッシュ $hoge->{0}; ハッシュへのリファレンス @hoge; 配列 @hoge{0}; エラー 配列へのアクセスは $hoge[0] でアクセス @hoge->{0}; エラー 配列へのリファレンスは $hoge->[0] でアクセス %hoge; 連想配列 %hoge{0}; 記述エラー 連想配列内の要素は $hoge{0} でアクセス %hoge->{0}; 記述エラ 連想配列へのリファレンスは $hoge->{0} でアクセス ${$hoge}; スカラのデリファレンス @{hoge}; エラー @{$hoge}; 配列のデリファレンス {@{$hoge{0}}} 連想配列内の配列をデリファレンス ($hoge{0} の中に配列が入っている) ただし外の {} は括る必要なし。 この場合 {} はブロックになる。 @{$hoge->[0]}; 配列へのリファレンスの中の配列 %{$hoge->[0]}; 配列へのリファレンスの中の連想配列 %{$hoge->{0}} 連想配列へのリファレンスの中の連想配列 こんな感じのも良く使うので覚えた方がいいかも。 $hoge = { 'array' => [], 連想配列へのリファレンスの中に配列を作る 'hash' => { 連想配列へのリファレンスの中に連想配列へのリファレンスを作る 'key1' => 'val', 'key2' => 'val', } }; それぞれへのアクセスは $hoge->{'array'}->[1]; $hoge->{'hash'}->{'key1'}; となる。
- 247 名前:nobodyさん mailto:sage [2011/10/25(火) 00:41:32.32 ID:???]
- > @hoge{0}; エラー 配列へのアクセスは $hoge[0] でアクセス
エラーではない が、スライスを理解して使っているわけではなく、たまたま動いているだけ、の初心者が多いと思う
- 248 名前:247 mailto:sage [2011/10/25(火) 00:42:17.13 ID:???]
- {} と [] を見まちがえた。ごめん。
- 249 名前:nobodyさん mailto:sage [2011/10/25(火) 01:04:32.90 ID:???]
- @hoge{0} なら %hoge に対するハッシュスライスでしょ
warnings 有効なら @hoge{0} は警告出るだろうが、 @hoge{0..2} とか、 my @keys = (0); @hoge{@keys} なら問題ないはず
- 250 名前:nobodyさん mailto:sage [2011/10/25(火) 01:31:51.65 ID:???]
- 指摘のある通り、%hoge; と宣言されてるなら @hoge{0} は動作する。
けどね。 質問者がくじけてる部分を考えたらスライスは考えないほうがいいのでは? という意味からエラーっていうことにした。 まぁ、言葉が足りなかったってのもあるけど ^-^;
- 251 名前:nobodyさん mailto:sage [2011/10/25(火) 01:51:36.00 ID:???]
- >>246
> @{hoge}; エラー エラーではない。 全ての変数や関数へのアクセス方法で一番冗長な書き方は sigil { (何か) } ([添え字]|{キー}) の形で、何かが裸の語なら変数名、リファレンスならデリファレンス、 それ以外なら何かの値を名前としたシンボリックリファレンスと解釈される。 通常の変数へのアクセスは、裸の語をデリファレンスすると捉えてもいい。 ${ foo } … 通常の変数。{} は*省略可能*。 ${foo} = "foo${foo}foo$foo"; # ok ${ "foo" } … シンボリックリファレンス ${ $foo } … スカラーリファレンス $foo をデリファレンス ${ 'f' . 'oo' } … 式の値を名前としたシンボリックリファレンス ${ \ foo('bar') } … foo('bar') の戻り値のリファレンスのデリファレンス perldoc.jp/docs/perl/5.10.0/perldata.pod#Slices > (引用注: 添え字/キーの) かっこの種類(大かっこか中かっこか)は、見ているものが配列か > ハッシュかをつかさどっています。一方、配列やハッシュの先頭の記号 ('$' か '@') は、 > 返ってくるものが単一の値(スカラ)か、複数の値(リスト)かを示しています。 use warnings; my @{foo} = ('a'..'f'); my %{bar} = ('g'..'j'); print ${foo}[3]; # 'd' へのアクセスで "d" を表示 print @{foo}[3]; # 警告有り。('d') へのアクセスで "d" を表示 print @{foo}[3,4]; # ('d','e') へのアクセスで "de" を表示 print ${foo}[3,4]; # 警告有り。リストをスカラーとして評価すると最後の値が返されるので "e" を表示 print ${bar}{'g'}; # 'h' へのアクセスで "h" を表示 print @{bar}{'g'}; # 警告有り。('h') へのアクセスで "h" を表示 print @{bar}{'g','i'}; # ('h','j') へのアクセスで "hj" を表示 print ${bar}{'g','i'}; # キー "g$;i" へのアクセスになるので undef
- 252 名前:nobodyさん mailto:sage [2011/10/25(火) 03:20:14.95 ID:???]
- > print ${bar}{'g','i'}; # キー "g$;i" へのアクセスになるので undef
これだけ知らなかったわ。awk 由来なのかな。 まあ積極的に使う意義は無さそうだし、 人のコードで見かけることもないから覚えなくてもいいよね。
- 253 名前:nobodyさん mailto:sage [2011/10/25(火) 22:21:51.58 ID:???]
- >>243
> クラスのnewのblessとか未だに何なのかわからない。祝福とは??? blessは意味わからないよね。 あれ、祝福とか変な言葉で説明するからわからんのさw オレ流に説明してあげよう。 まず、これを実行してみよう。Dumperは変数の中身を表示する関数だ。use Data::Dumperが必要。 my $a = {key=>1}; print Dumper($a) 以下のように表示される。(改行インデントは折りたたむ) そう、ようするにただのハッシュだ。 $VAR1 = {'key' => 1}; 次に次の命令を実行してみよう。 my $a = {key=>1}; bless($a, "CLASS"); print Dumper($a) 以下のように表示される。さっきのハッシュの周りにCLASSが追加されている。 VAR1 = bless( {'key' => 1}, 'CLASS' ); つまりだ、これはCLASSという名前のクラス名(モジュール名)付きのハッシュということだ。 このモジュール名付きのハッシュにたいして、以下のように->を使って呼び出しをすると、 $a->foo() $aにはCLASSというモジュール名が結びついているため、CLASS::foo()を呼び出すんだなとPerl実行環境は理解できる。 その時CLASS::foo()の第一引数に$aを渡すことで、foo()の中で$aの値の操作することが可能にある。 これでCLASSクラスのfoo()メソッド呼び出しの仕組みと、$aをCLASSクラスのインスタンスに変換することができた。
- 254 名前:nobodyさん mailto:sage [2011/10/25(火) 22:33:18.24 ID:???]
- もう一つ、$a->foo() という書き方。
$a に bless使ってCLASSと結びつけたハッシュが入っていれば、 CLASS::foo()が呼び出されるわけだが、 $aは文字列でもよい。つまり、 $a = 'CLASS'; $a->foo(); この方式でもCLASS::foo()が呼び出せる。 通常は、CLASSを$aに入れずにそのまま書いて、CLASS->foo() となる。 でこれが foo()じゃなくて new() だと、CLASS->new() となる。 呼び出されるのは、当然CLASS::foo(); そして foo() の第一引数にはCLASSという文字列が入っている。 これを利用してCLASS::newされた時に、CLASSに結びつけたハッシュ、 つまりCLASSのインスタンスを返すことで、Perlにおけるnewの仕組みとなる。 あと余談。殆どの場合ハッシュにCLASSを結びつけるのだが、 別にただの値にCLASSを結びつけるのも一応可能。
- 255 名前:nobodyさん mailto:sage [2011/10/25(火) 22:34:03.01 ID:???]
- 訂正
×呼び出されるのは、当然CLASS::foo(); そして foo() の第一引数にはCLASSという文字列が入っている。 ○呼び出されるのは、当然CLASS::new(); そして new() の第一引数にはCLASSという文字列が入っている。
- 256 名前:nobodyさん mailto:sage [2011/10/25(火) 22:36:14.83 ID:???]
- > あと余談。殆どの場合ハッシュにCLASSを結びつけるのだが、
> 別にただの値にCLASSを結びつけるのも一応可能。 ただの値にblessはできんか。 何かしらの値のリファレンスにblessできる。
- 257 名前:nobodyさん mailto:sage [2011/10/25(火) 23:11:45.61 ID:???]
- system("wget $url");
を使ってファイルをダウンロードしたいのですがうまくいきません。 perl というかwget の使い方の問題なのかもしれませんが、 適切な書き方をご存知のかたがいらっしゃったらおしえていただけませんか? ダウンロードしたいファイルは以下のURLです。 ttp://ncode.syosetu.com/txtdownload/dlstart/ncode/108715/?no=1&hankaku=0&code=utf-8&kaigyo=CRLF エラーとしては、こう言われます。 index.html?no=2&hankaku=0&code=utf-8&kaigyo=CRLF: Invalid argument Cannot write to `index.html?no=2&hankaku=0&code=utf-8&kaigyo=CRLF' (Invalid argument).
- 258 名前:nobodyさん mailto:sage [2011/10/25(火) 23:53:11.13 ID:???]
- 自分は、たまーにハッシュに名前が欲しくて bless する事もあるw
use LWP::Simple; my $data = get('URL'); 特に認証がなければ、これで取得できるかと。 自分は use LWP::UserAgent; use HTTP::Request::Common; use utf8; my $ua = LWP::UserAgent->new; 〜agent とか timeout とか max_redirect とか cookie の設定〜 my $req = GET('URL'); my $res = $ua->request($req); my $content = $res->code() eq '200' ? decode('utf-8', $res->content()) : ''; ってやってる。 手順が多いけど、自分の頭ではこの方が使いやすい。 $res->code() eq '200' の部分は $res->is_success とかで置き換えられるけど、回線がパンパンのときに失敗すると is_success は 1 を返すので信用出来ない。 HTML の取得なら、$res->content() に </html> が含まれるかどうかで判断した方が良い。 つっても、殆どの場合は is_success や is_error は正しく動作する。
- 259 名前:nobodyさん mailto:sage [2011/10/26(水) 01:13:19.12 ID:???]
- >>257
wget は特に指定がなければサーバのパスに対応するファイル名でローカルに保存しようとするから、 ? はファイル名に使えねえよと言われてるのでは。Windows ないから試せないけど。 >>258 sub is_info ($) { $_[0] >= 100 && $_[0] < 200; } sub is_success ($) { $_[0] >= 200 && $_[0] < 300; } sub is_redirect ($) { $_[0] >= 300 && $_[0] < 400; } sub is_error ($) { $_[0] >= 400 && $_[0] < 600; } sub is_client_error ($) { $_[0] >= 400 && $_[0] < 500; } sub is_server_error ($) { $_[0] >= 500 && $_[0] < 600; } # HTTP::Status より。 失敗したにもかかわらず is_success が真を返すというなら、 まず疑うべきは LWP でなくサーバ側のレスポンスでは? 原因がクライアント/サーバ/回線/他のいずれにせよ、 負荷等が原因で200以外の2xxが返ってくる状況なんてちょっと想像つかんが。 decode('utf-8', $res->content()) はよっっっぽど古いバージョンの LWP じゃない限り $res->decoded_content(charset => 'utf-8') のほうがよかろ。
- 260 名前:nobodyさん mailto:sage [2011/10/26(水) 01:38:17.35 ID:???]
- >>259
失敗なのに is_success が成功を返すのは少々特殊な状況なのは分かってる。 自宅でサーバー動かしてて家のルータは BA8000Pro なんだけど、BitTorrent で Linux ISO を放流してる。 バージョンアップがくるとコネクションがすごい数やって来て、NAT のテーブルが溢れて (上限は 2600) 名前解決すら頻繁に失敗するほど不安定になる。 この状況下で LWP で GET とかすると is_success が成功を返しても、->content() が全てを受け取ってないという事が起こる。 そのほかの環境は弄らずに BitTorrent だけ止めると LWP は正常に送受信できる。 これは何度も再現するのはテスト済。 ちなみに BitTorrent を動かしてるのは WEB サーバーとは別の PC です。 最近は BitTorrent 動かしてないからこういった症状ともおさらばで快適人生♪ >> decoded_content おぉ〜、こんなメソッドあったんですね。ありがとう! 常々 Encode 呼び出すのめんどくせーって思ってたんで助かる。
- 261 名前:nobodyさん mailto:sage [2011/10/26(水) 02:43:24.74 ID:???]
- >>259
>>257です。 アクセスが出来ないじゃなくて、書き込みができないっていう意味だったんですね。 もっと自分でよく考えてみるべきでした。 -Oオプションを付けて書き込むファイル名を指定したところ上手くいきました。 知恵を貸していただきありがとうございます。
- 262 名前:nobodyさん mailto:sage [2011/10/27(木) 00:59:33.75 ID:???]
- >>244-256
あんなふざけたレスにマジレス返してくれてどうもありがとうございます。 まだ全部は試せてないですが、>>246とか物凄く参考になっています。 perldoc.jpなども読んで、もう少し勉強してみますね。
- 263 名前:nobodyさん mailto:sage [2011/10/27(木) 01:39:37.97 ID:???]
-
変数名の前の @、$、% の意味 (* ってのもあるけど、難しいので放置で OK) 変数に代入するときの { }、[ ]、( ) の意味を覚えるだけで、理解度はかなり違うと思います。 あとは perl の自由な書き方に慣れていただくしかw
- 264 名前:nobodyさん mailto:sage [2011/10/27(木) 16:41:18.27 ID:???]
- たまに間違う… そういえばあんまり代入の時に [ ] って使わないなあ。
使ったことがないわけじゃないんだけど。
- 265 名前:nobodyさん mailto:sage [2011/10/27(木) 18:34:30.14 ID:???]
- 最近は面倒くさいので $data = [] とか $data = {} とかで済ますこと多いな。
- 266 名前:nobodyさん mailto:sage [2011/10/28(金) 20:00:02.80 ID:???]
- Perlでw3mのようなコンソールアプリケーションを作る方法はあるのでしょうか?
環境はLinuxです。 よろしくお願いいたします。
- 267 名前:nobodyさん mailto:sage [2011/10/28(金) 20:16:08.47 ID:???]
- curses を扱うモジュールはあるみたいだし、できるんじゃね
Python とかのほうが向いてる気はするけど
- 268 名前:nobodyさん mailto:sage [2011/10/30(日) 22:07:34.60 ID:???]
- みなさんモデリングツールでUMLは使ってますか?
もし使ってる方はどのソフト使ってますか? ttp://hibari.2ch.net/test/read.cgi/tech/1147499933/ ↑ここでperlの話題がなく、「perl uml」で検索してもそれらしいものが見つからなかったので質問しました。 UMLを勉強しようと思うのですがどのツールがいいのかもわかりません。。
- 269 名前:268 mailto:sage [2011/10/31(月) 00:15:05.76 ID:???]
- >UMLを勉強しようと思うのですがどのツールがいいのかもわかりません。。
これはココだとスレ違いですね。 この一文は無視して下さい。
- 270 名前:nobodyさん mailto:sage [2011/11/01(火) 11:30:50.31 ID:???]
- バイナリデータについて質問です。
docomo携帯の太陽のSJIS絵文字コード(F89F)を表示しようとしたのですが、 (1)は表示されて、(2)は単なる文字列になっているようでした。 \x{}といった表記ではバイナリにならないのでしょうか? また、バイナリにする場合、""での設定やpack()など色々あると思うのですが、 処理が速いのはどの方法になるのでしょうか? (1)my $sun = "\xF8\x9F" (2)my $sun = "\x{F89F}"
- 271 名前:nobodyさん mailto:sage [2011/11/01(火) 13:02:20.96 ID:???]
- >>270
perldoc.perl.org/perlop.html#Quote-and-Quote-like-Operators > If the number is 256 (0x100, 0400) or above, Perl interprets it as a Unicode code point > and the result is the corresponding Unicode character. www.nttdocomo.co.jp/service/developer/make/content/pictograph/basic/ よって iモードの Shift_JIS で "\xF8\x9F" に割り当てられている絵文字を iモードの UTF-8 のページで出したければ "\xEE\x98\xBE" 。 (Perl用語で言うところの) Unicode 文字列なら "\x{E63E}" 。 参考ページ: >>2 perldoc.jp/docs/perl/5.10.0/perluniintro.pod search.cpan.org/dist/Encode-JP-Mobile/lib/Encode/JP/Mobile.pm search.cpan.org/dist/Unicode-Japanese/lib/Unicode/Japanese/JA.pod
- 272 名前:270 mailto:sage [2011/11/01(火) 15:15:58.07 ID:???]
- >>271
解決しました。 詳しい説明ありがとうございました。
- 273 名前:nobodyさん mailto:sage [2011/11/01(火) 15:20:02.29 ID:???]
- my $a = {
x => [ 'a', '1' ], y => [ 'b', '2' ], z => [ 'c', '3' ], }; my $b = map{}??? 上記で$bに下記のようにセットするにはmapのところをどのように書けばよいでしょうか。 $b = { x => 'a-1', y => 'b-2', z => 'c-3', };
- 274 名前:nobodyさん mailto:sage [2011/11/01(火) 15:36:36.16 ID:???]
- >>273
$b = { map { $_ => "$a->{$_}[0]-$a->{$_}[1]" } keys %$a }; # or $b = { map { $_ => join '-', @{ $a->{$_} }[0,1] } keys %$a };
- 275 名前:nobodyさん mailto:sage [2011/11/01(火) 15:59:53.49 ID:???]
- >>273
my $b = { map ref $_ ? join('-', @$_) : $_, %$a }; my $b; %$b = map ref $_ ? "$_->[0]-$_->[1]" : $_, %$a;
- 276 名前:273 mailto:sage [2011/11/01(火) 16:40:41.18 ID:???]
- >>274,275
解決しました。 回答が早くて助かりました。 ありがとうございます。
- 277 名前:nobodyさん mailto:sage [2011/11/01(火) 17:31:41.93 ID:???]
- サンプルとはいえ$aと$bは安易に使わないほうがいいぞ
- 278 名前:273 mailto:sage [2011/11/01(火) 17:56:13.77 ID:???]
- use HTML::Template について質問です。
テンプレートファイル内で、「html出力させないコメント」というのは書けないのでしょうか? 例えば下記の#の行はoutputで出力させないといった動作をさせたいです。 もしできないのであれば、使用されている皆さんはコメントを書きたい時、<!-- -->で対応しているのでしょうか? <html> <head> <title>hoge</title> </head> <body> fuga<br> #コメントを書きたい </body> </html>
- 279 名前:nobodyさん mailto:sage [2011/11/02(水) 04:52:21.99 ID:???]
- >>278
無かったはず。 ただし、new()の際にfilterを設定することで、前処理を行うことが出来る。 これを利用して、特定の文字列を置き換える(削除する)ことは可能。 詳細はドキュメントを参照されたい。 HTML::Templateは痒いところに届かないというか、痒み?何それ? って作り方だからなあ。 非PGのデザイナーにテンプレートファイル作りを任せるなら、これくらいじゃないと使ってくれなかったりするがw
- 280 名前:nobodyさん mailto:sage [2011/11/02(水) 07:58:44.36 ID:???]
- >>276
案の定Wikipediaの丸暗記か
- 281 名前:nobodyさん mailto:sage [2011/11/02(水) 10:15:20.86 ID:???]
- >>280
君はまた見えない敵を作って、勝手に戦うのかい?
- 282 名前:デフォルトの名無しさん mailto:sage [2011/11/03(木) 03:59:56.91 ID:???]
- >>280
おみそれいたしました。 丸暗記だと応用が効かなくて行き詰ってしまうことが多いです。
- 283 名前:nobodyさん mailto:sage [2011/11/03(木) 20:45:59.15 ID:???]
- ↓こちらのスレで誘導されてこの板に来ました。
Perlについての質問箱 49箱目 hibari.2ch.net/test/read.cgi/tech/1319953460/100-102n Windows 2000、Activeperl 5.8 の環境で、 use Socket; socket(・・・); connect(・・・); な感じでインターネット上のwebサイトからページを取得してるんだけど、 サイトの応答が遅いとき、応答が帰ってくるまでCPU負荷が100%近くになる。 これってどういった原因が考えられますか? あるいは仕様でしょうか。 PCのスペックはWin2000を使っているというあたりで想像いただける通りかなりしょぼいですが、それにしても負荷高すぎかな、と。 Activeperlのバージョン上げれば直るのかな…
- 284 名前:nobodyさん mailto:sage [2011/11/03(木) 22:20:35.11 ID:???]
- パソコンを変えることができないなら、LANカードを取り替えるか
あるいは追加して、それを使うようにして対処。 今使っているLANカード+ドライバが割込みに対応した作りではない のでCPU負荷が100%近くになっている。
- 285 名前:nobodyさん mailto:sage [2011/11/03(木) 22:28:37.56 ID:???]
- >>PCのスペックはWin2000を使っているというあたりで想像いただける通りかなりしょぼいですが
端折るな ちなみに Pentium3 1GHz、ActivePerl 5.12 のうちの環境は sleep 使うと CPU 占有率が 80-90% とかになる。
- 286 名前:nobodyさん mailto:sage [2011/11/03(木) 22:52:53.96 ID:???]
- >>284
LANカードの問題ですか。 ノートだから交換や追加は難しいですね… >>285 すみません。 Pen4M1.8G(但し1.2G動作)です。 ありがとうございました。
- 287 名前:285 mailto:sage [2011/11/03(木) 23:57:43.11 ID:???]
- NetBurst か。
デスクトップの Pentium4 ですら同じくロックまで落とすと Pentium3 に負けるからなぁ・・・ ただそれ以外の部分 (チップセットとかね) は Pentium3 世代よりも上だから、CPU はボトルネックとは考えられないか。 古いノートだったら 10Base-T とかの可能性も否定できないよね。 あとアンチウイルスとかスパイウェア関連は外すのも手。 TCP/IP の入出力を監視してたりするので負荷が掛かるのは当たり前だから。 定期的にスクレイピングのために Perl スクリプト走らせてるんだけど、 今見たら 60-80% の CPU 占有率だった。 これ以上はハードとか OS の問題になってきそうなのでスレ違いどころか板違いすらにもなってくるかな?w その前に色々書いておく。 特に大事なデータが無ければ OS 再セットアップして、アンチウイルスとかスパイウェア関連は入れない。 もし直らなければ、ノートの製造が AOpen や Acer などの安かろう悪かろう的なメーカーでないか確認。 なおかつ使用チップセットが Intel 以外だった場合は遅いのはハードウェアが原因と見て良いかと。 上記以外のメーカーで Intel チップセットの場合は >>284 が書いたとおり LAN カードが怪しいかも? USB の LAN もあるけど、そもそも負荷が高いので使っちゃだめ。 32bit CardBus が付いてるならその LAN カードを。 これでも駄目なら投げ捨てる。
- 288 名前:nobodyさん mailto:sage [2011/11/04(金) 00:21:01.33 ID:???]
- CD起動のLinuxで同じスクリプトを実行してハードの問題かどうかを切り分けてみる。
- 289 名前:283 mailto:sage [2011/11/04(金) 08:21:22.37 ID:???]
- >>287
ハードやOSの問題だと板違いですね。 ただ、ブラウザでアクセスしている場合にはそういった問題は発生しないのでperl側の問題という線も捨てきれないのかな、と。 ちなみに、常駐系のソフトは全て停止しても状態は同じでした。 とりあえず、まずはLANカードの線で、何か試す方法がないか検討してみます。 >>288 ちょっとハードルが高いですね。 Linixの知識は全くないので、そこにたどり着くまでの時間が取れそうにないです。 改めてありがとうございました。
- 290 名前:278 mailto:sage [2011/11/04(金) 11:25:15.47 ID:???]
- >>279
最初に任意のルーチンの割り込みができるんですね。 いまバタバタしてるので時間が空いたらじっくり調べてみます。 ありがとうございました。
- 291 名前:nobodyさん mailto:sage [2011/11/05(土) 11:43:23.98 ID:???]
- >>289
BIOSのIRQの設定も板違いですね。 そうだとするとLANカードを変えても同じことになりそうなので。
- 292 名前:nobodyさん mailto:sage [2011/11/06(日) 08:06:31.58 ID:???]
- $test . '_aiueo'
こうゆう文字列でマッチさせようとしたときに、何も考えずに書けば /$test_aiueo/ だけど、これじゃ $test_aiueo っていう変数は無いからエラーになるわけで、 $test という変数の直後に半角英数でマッチさせるにはどうすれば良いのでしょうか?
- 293 名前:nobodyさん mailto:sage [2011/11/06(日) 08:12:06.72 ID:???]
- すんません解決しました。
/${test}_aiueo/ こうゆう書き方できるんですね。 $hash={} を %{$hash} とか普段から使ってるクセに、なんですぐに書けなかったんだろう。。。
- 294 名前:nobodyさん mailto:sage [2011/11/06(日) 10:03:01.99 ID:???]
- こういう
- 295 名前:nobodyさん mailto:sage [2011/11/06(日) 12:03:43.66 ID:???]
- 作ったスクリプトのどこの部分が処理に時間が掛かってるのか知りたいです。
処理ごとにデバッグプリントすれば可能ですが、非現実的だし、 後々デバッグプリントを消すのも手間なので、Perlでどこの部分で 時間が掛かってるとかのデバッグというか、トレースというか、 そういう事は出来るモジュールなどはあるのでしょうか?
- 296 名前:nobodyさん mailto:sage [2011/11/06(日) 12:30:01.91 ID:???]
- >>295
perldoc.jp/docs/perl/5.10.1/perlfaq3.pod#How32do32I32profile32my32Perl32programs63
- 297 名前:nobodyさん mailto:sage [2011/11/07(月) 11:15:35.01 ID:???]
- >>296
ありがとうございます。 #!/usr/bin/perl -d use Devel::DProf; で tmon.out を吐かせた後に dprofpp で得たいデータが取れました。
- 298 名前:278 mailto:sage [2011/11/07(月) 14:03:34.80 ID:???]
- 以前html::templateで質問したものです。
>>278の件は解決できました。 ありがとうございました。 もう一つ質問があります。 TMPL_INCLUDEのパスをcgi上でコントロールしたいのですが、下記のようなテンプレートはNGとなっています。 <TMPL_INCLUDE NAME="<TMPL_VAR NAME=incPath>"> そこでfilterを使って表現しようと思うのですが、どのようにすればよいでしょうか? ※cgi内の変数がfilter内のサブルーチンでそのまま使用できるのは確認できています。 my $incPath = './tmpl/inc.tmpl'; my $template = HTML::Template->new( filename => './aaa.tmpl', filter => sub{ my $ref = shift; $ref =~ s/(\$[a-zA-Z0-9_]+)/eval($1)/g; #←ここの置換後の表現が思いつかないのでやりたいことのイメージを書いています。 }, ); --- template --- <TMPL_INCLUDE NAME="$incPath">
- 299 名前:298 mailto:sage [2011/11/07(月) 17:02:01.60 ID:???]
- >TMPL_INCLUDEのパスをcgi上でコントロールしたいのですが、
すみません。この一文はわかりづらいですね。 この文は無視してください。
- 300 名前:nobodyさん mailto:sage [2011/11/08(火) 02:25:10.62 ID:???]
- >>298
コメント削除の件は解決して何より。 インクルードファイルを動的に制御するなら、素直に<TMPL_IF>や<TMPL_UNLESS>で分岐させるのが良いのでは。 もしくは、CGI側で別途に読み込んで、<TMPL_VAR>で吐き出すか。 インクルードファフィルのルートディレクトリを指定するだけなら、 new()の時に path を指定することでコントロールできるっぽい。 【余談】 HTML::Templateは条件分岐がマトモに書けないから、可能なら拡張モジュールの利用も考えてみて。 自分は使ったことがないんだけど search.cpan.org/~samtregar/HTML-Template-Expr-0.07/Expr.pm とかどうだろうか
- 301 名前:298 mailto:sage [2011/11/09(水) 16:21:33.08 ID:???]
- >>300
もしかして279の方ですかね? またまたご意見ありがとうございます。 色々試行錯誤しましたが、今回はfilterに下記のようにして対応することにしました。 $replace_ref = { HENSUU => 'hogehoge', }; filter{ $ref = shift; $$ref =~ s|\[\#.*?\#\]||gxms; # [# 〜 #]までをコメント $$ref =~ s|\[\%\s+([a-zA-Z0-9_]+)\s+\%\]|$replace_ref->{$1}|gxms; # [% 〜 %]を置き換え } ----- html -----(どんなフォーマットがHTMLに影響ないかわからなかったので変数置き換えはtemplate-toolkitを参考) <html><body> [# コメント #] 変数=[% HENSUU %] </body></html> --------------- HTML::Template::Exprいいですね。 HTML::Template::Proにも取り込まれてるんで、高速化したい時には置き換えが簡単そう。 HTML::TemplateはIF文が貧弱すぎる。
- 302 名前:nobodyさん mailto:sage [2011/11/15(火) 20:21:14.83 ID:???]
- パターンマッチについてなのですが、
------------------- <span class="availGreen">在庫あり。</span> <a href="/gp/help/customer/display.html?&nodeId=915624"> 在庫状況</a>について<br /> この商品は、<b><a href="/gp/help/customer/display.html?ie=UTF8&nodeId=64 3004">Amazon.co.jp</a></b> が販売、発送します。 ギフトラッピングを利用できます。 ------------------- この文字列(実際には改行は入っていない)から、「Amazon.co.jp」(他の店名になることもある))の部分だけを取り出す為に if ( $_ =~ />(.*?)<\/a><\/b> が販売/ ) {print $1;} とすると、 ------------------- 在庫あり。</span> <a href="/gp/help/customer/display.html?&nodeId=915624"> 在庫状況</a>について<br /> この商品は、<b><a href="/gp/help/customer/display.html?ie=UTF8&nodeId=64 3004">Amazon.co.jp ------------------- までが拾われてしまいます。 if ( $_ =~ /この商品は、<b><.*?>(.*?)<\/a><\/b> が販売/ ) {print $1;} とすることにより、目的は達成できたのですが、何故最初のがダメなのかが良くわかりません。 なお、直前の「643004」の部分は場合によって変わるのでキーワードには出来ません。
- 303 名前:nobodyさん mailto:sage [2011/11/15(火) 20:47:48.16 ID:???]
- 何故って…
.*?にはタグ(<.*?>)を含まないなんてルールはないし
- 304 名前:nobodyさん mailto:sage [2011/11/15(火) 21:30:08.07 ID:???]
- 最小マッチの「最小」の意味を勘違いしてるパターンと予想。
.*? か .* かで影響されるのは "</a></b> が販売" の部分の探し方であって、 マッチすること自体が確定したら最初の ">" の位置は動かない。 関係ないが、この手の情報取得は可能ならまずAPIを検討すべき。 泥臭くスクレイピングするとしても、よほど高速性を重視するとかでなければ 正規表現じゃなくてTreeBuilderとかでDOMをパーズするほうが安全。
- 305 名前:nobodyさん mailto:sage [2011/11/16(水) 00:15:29.63 ID:???]
- >>304
ありがとう。 最初の「>」で拾ってしまうんですね。 高速性の必要なものではなく、いくつかの商品の価格変化をログ取ってるだけなので、 API利用するところまでは考えてません。手続きめんどいので。
- 306 名前:nobodyさん mailto:sage [2011/11/16(水) 06:46:36.29 ID:???]
- >>305
拾いたい箇所が1ファイルに1箇所くらいで構造も単純ならパターンマッチングの方が 手っ取り早いよね。 でも構造が繰り返しだったりややこしかったりする時はWeb::Scraperとか便利よ。 >>304 パーズ? パース? ← parse
- 307 名前:nobodyさん mailto:sage [2011/11/16(水) 07:50:11.05 ID:???]
- 考えるの面倒だからという理由で、モジュールに丸投げする底辺でゴメンナサイ
- 308 名前:nobodyさん mailto:sage [2011/11/16(水) 09:59:12.27 ID:???]
- そのためのモジュールでしょ 無問題
- 309 名前:304 mailto:sage [2011/11/16(水) 10:04:04.24 ID:???]
- ありゃ。smooth(ズ)→スムース みたいなもんで英語では parz って発音するものだと思い込んでたからそれに合わせてたわ。
調べてみたらイギリス英語系の辞書だとパーズだけど、アメリカ英語でパースが一般的みたいだからそっちのほうがいいや。サンクス
- 310 名前:nobodyさん mailto:sage [2011/11/16(水) 16:16:46.49 ID:???]
- >>309
>イギリス英語 へー。良いことを知った。
- 311 名前:nobodyさん mailto:sage [2011/11/16(水) 16:34:39.13 ID:???]
- 本当だ。
2つ発音されるね。 parseの意味 - 英和辞書 - goo辞書 dictionary.goo.ne.jp/leaf/ej3/61513/m0u/parse/
- 312 名前:nobodyさん mailto:sage [2011/11/16(水) 16:52:26.25 ID:???]
- そうか。どっちもありなんだ。
勉強になったぜ。
- 313 名前:nobodyさん mailto:sage [2011/11/16(水) 23:26:19.41 ID:???]
- テキストファイルから3行だけほしいときって、1行で記述することってできますか?
今は for で回して push してるんだけど、 @lines = <$fh> x 3; みたいな感じで書けたら落ですよね。。。
- 314 名前:nobodyさん mailto:sage [2011/11/17(木) 00:05:31.82 ID:???]
- >>313
#!/usr/bin/perl -w use strict; my @line = (scalar <DATA>, scalar <DATA>, scalar <DATA>); # 幾つ? print @line, "---\n"; seek DATA, -12, 1; @line = (); @line = map scalar <DATA>, 0..2; # 0から2とは? print @line, "---\n"; seek DATA, -12, 1; @line = (); push @line, scalar <DATA> while @line < 3; # 意図が分かりやすい print @line; __DATA__ foo bar baz quux
- 315 名前:nobodyさん mailto:sage [2011/11/17(木) 00:27:12.12 ID:???]
- やっぱ、なんかしらで回すしか無いですよね。
ありがとうございました。
- 316 名前:nobodyさん mailto:sage [2011/11/17(木) 00:48:38.68 ID:???]
- >>315
ループを避ける事自体が至上命令ならば >>314 の1番目か $/ = \64; # 充分なサイズのバッファ my @line = <DATA> =~ /^(.*\n)(.*\n)(.*(?:\n|\z))/;
- 317 名前:nobodyさん mailto:sage [2011/11/17(木) 00:53:27.15 ID:???]
- @line = (<DATA>)[0..2];
- 318 名前:nobodyさん mailto:sage [2011/11/17(木) 09:42:10.49 ID:???]
- 至上主義ってわけじゃないんだけど、ループの中で特に処理をするわけじゃないから
1行で簡潔にできたら嬉しいよね〜 っていう程度です。
- 319 名前:nobodyさん mailto:sage [2011/11/18(金) 00:09:48.76 ID:???]
- ループを決して書こうとしない部下を思い出した。
そいつは自分自身がループして同じ内容を必要な行数分タイプしてたっけ。
- 320 名前:nobodyさん mailto:sage [2011/11/18(金) 09:22:43.24 ID:???]
- 8bit機の時代はループの条件判定のタイムロスを惜しんで
ループ展開とかやったっけな。アセンブラで。
- 321 名前:nobodyさん mailto:sage [2011/11/18(金) 10:21:10.82 ID:???]
- ループではないけど、100程度のif文を自動生成するプログラムなら見たことがある…
- 322 名前:nobodyさん [2011/11/18(金) 21:40:15.63 ID:1hunDax1]
- 入門書を読んでて気になったのですが
ダブルクォート文字列で使われるエスケープシーケンスと マッチ演算子の中の正規表現で使われるエスケープシーケンスは よく使われる改行文字(\n)やタブ(\t)などが両方にあるので 厳密に言えば違うけれども、大体同じものと理解していいのでしょうか? それとも全く違う、あるいは全く同じものなのでしょうか?
- 323 名前:nobodyさん mailto:sage [2011/11/18(金) 21:56:27.18 ID:???]
- 覚えることが少なくなるように同じ記法を採用しているだけで、
それを解釈するコードは文字列と正規表現では別物だと考えて ください。
- 324 名前:デフォルトの名無しさん mailto:sage [2011/11/19(土) 13:39:08.87 ID:???]
- 全く同じであれば、本の記述は1回のはず。
別物だから区別して書いてあって、本に2回出てくる。 でも覚えやすいように同じ記法にしている。
- 325 名前:nobodyさん mailto:sage [2011/11/23(水) 23:35:55.57 ID:???]
- やっと規制がとけました
>>323-324 ありがとうございます
- 326 名前:nobodyさん mailto:sage [2011/11/26(土) 22:25:41.09 ID:???]
- CGIに値を渡したいときの方法で質問です。
@ttp://example.com/index.cgi/1/2/ と、PATH_INFOで渡すのと Attp://example.com/?a=1&b=2 と、.htaccessに「DirectoryIndex index.cgi」を書いてPOST風?(呼び方がわからない)で取得する方法があると思いますが、 みなさんどちらを使っていますか? どちらを使おうか悩んでいます。 (最初、index.cgiを消してPATH_INFOで渡せればすっきりするなと思いましたが、それだとttp://example.com/1/2/となって index.cgiを読ませる場所とPATH_INFOの切り分けができないと気づいて今に至っています) 個人の好みになるかもしれませんが、こっちをこんな理由で使っているという感想などいただけたら参考にしたいと思います。 ちなみにformタグではGETを使用しています。
- 327 名前:nobodyさん mailto:sage [2011/11/26(土) 22:49:02.08 ID:???]
- >>326
txqz.net/blog/2007/06/16/1641
- 328 名前:nobodyさん [2011/11/26(土) 23:38:20.62 ID:zFlJhwY9]
- system()で外部コマンドを呼び出すと呼び出しは行われるのですが、そのあとの処理に進まずに
Internal errorになってしまいます。なにか呼び出し方があるのでしょうか system '/bin/ls', "-la"; print "Location: index.html\n\n";
- 329 名前:nobodyさん mailto:sage [2011/11/26(土) 23:51:55.90 ID:???]
- そのスクリプトを手元で実行したことはあるかい?
- 330 名前:nobodyさん mailto:sage [2011/11/27(日) 00:07:55.85 ID:???]
- CGIで動かしてるんだったらHTTPサーバのログにエラー内容が記録されてるんじゃないか?
- 331 名前:nobodyさん [2011/11/27(日) 00:56:06.95 ID:E4v1+esL]
- malformed header from script. Bad header=total 68: test.cgi, referer: redhat6/test.html
とか出てます。Systemを実行しなければこのメッセージは出ないです。
- 332 名前:nobodyさん mailto:sage [2011/11/27(日) 01:07:18.85 ID:???]
- >malformed header
だからヘッダがどうなってるか見ろ
- 333 名前:nobodyさん [2011/11/27(日) 01:44:44.18 ID:E4v1+esL]
- ls -la とか バイナリの実行ファイルとかですが、、、
- 334 名前:nobodyさん mailto:sage [2011/11/27(日) 02:47:47.23 ID:???]
- うーん…
真っ先に HTTP ヘッダがなければCGIとして機能しないでしょ。 エラーになるのは当たり前。 でもって Location: で飛ばしてるんだから system '/bin/ls', '-la'; は全く意味がない。 仮に print "Location: index.html\n\n"; の次に置いても無視されるだけ。 そのCGIの目的(用途)は何なの?
- 335 名前:nobodyさん mailto:sage [2011/11/27(日) 03:52:11.45 ID:???]
- ん? Location: 〜 を print しようがスクリプト自体は最後まで走るでしょ?
問題は system の出力先が標準出力、つまり普通に print するのと同じところに行ってるせいで、 スクリプトからサーバーへ渡される出力が total 8 drwxr-xr-x 2 nobody nogroup 4096 Nov 27 00:00 ./ drwxr-xr-x 3 nobody nogroup 4096 Nov 27 00:00 ../ Location: index.html みたいになってて、 サーバーとしては改行2つより前の部分は HTTP ヘッダとして解釈しなきゃいけない、 でも Location 以外の行は正しい HTTP ヘッダではない。 だからそこで内部エラーとして止めてる、ってことでは? CGI 試す環境ないんで推測だけど。
- 336 名前:nobodyさん mailto:sage [2011/11/27(日) 04:36:05.90 ID:???]
- >>335
だからそう書いてるだろ。
- 337 名前:nobodyさん mailto:sage [2011/11/27(日) 23:08:22.74 ID:???]
- >>332
「ヘッダ」が分からないので見ろといわれてる対象が分かっていない に一票。 つまり print "Location: index.html\n\n"; は、理解して書いているのではなく、他のプログラムのコピペ。
- 338 名前:nobodyさん mailto:sage [2011/11/27(日) 23:27:05.03 ID:???]
- print "Location: index.html\n\n"; の前に system を置いちゃうくらいだからそうなんだろうな。
- 339 名前:nobodyさん mailto:sage [2011/11/28(月) 01:55:16.13 ID:???]
- ここまで答えのようなヒントが出てれば、あとは大丈夫でしょう。きっと・・・
|

|