トップページ⇒php
1001コメント296KB

Perlコーディング初心者質問スレ Part 58

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2008/08/06(水) 22:54:32ID:???
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

お勧めサイトは >2 以降

前スレ http://pc11.2ch.net/test/read.cgi/php/1203935151/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0523nobodyさん2008/12/14(日) 18:06:05ID:???
全部よもうとせずに必要なところを少しずつ読むといいかも。

あとは、初めて目にするモジュールがあれば、
CPAN で検索してみればいいんじゃないかと思う。
http://search.cpan.org/

死にゆく言語だががんがってくれ!
0524nobodyさん2008/12/14(日) 18:22:07ID:???
死にそうなんじゃなくて枯れてるだけです><
0525nobodyさん2008/12/14(日) 18:45:13ID:???
>>523
今後伸びていく言語は何だと思いますか?
0526nobodyさん2008/12/14(日) 19:46:28ID:???
>>525
それスレチじゃね
0527nobodyさん2008/12/16(火) 13:59:20ID:vcMtnNeb
URLの解析を行っているのですが、CGIにGETメソッドでパラメータを渡す場合、
以下のように "?" でURLとパラメータを区切ると思います。

http://server/path?name1=value1&name2=value2

しかし、あるサイトでは"?"を使わずに"/"が区切り文字になっているようです。

http://server/path/name1=value1&name2=value2

このような記法は普通に利用されるものでしょうか?
詳しく解説しているサイト(RFC)等がありましたら教えて下さい。
0528nobodyさん2008/12/16(火) 14:21:14ID:???
mod_rewrite の範疇なので、鯖板の方で聞いてみては如何でしょうか?
0529nobodyさん2008/12/16(火) 14:25:49ID:???
>>527
それPerl関係ない。
Webサーバでそーゆー風に処理している
0530nobodyさん2008/12/16(火) 14:30:11ID:???
でも、何で区切り文字だけ変えるんだろう。折角なら、.htmlにした方がSEO対策としては良くね?
スレ違いスマソ
0531nobodyさん2008/12/16(火) 15:33:00ID:???
>>527
例があやしすぎるが、、、
PATH_INFO使ってんじゃないの?
0532nobodyさん2008/12/16(火) 16:01:55ID:???
>>527
PATH_INFO
05335322008/12/16(火) 16:02:23ID:???
ああ531見えてなかった申し訳><
0534nobodyさん2008/12/16(火) 17:47:44ID:???
>>527
【Apache】mod_rewriteについて語るスレ
http://pc11.2ch.net/test/read.cgi/php/1023791370/

探せばどっかに答えがあるというか、ほとんどその類の質問しかないスレ。
0535nobodyさん2008/12/16(火) 20:34:45ID:???
use overloadについて詳しく解説されているサイト、
もしくはoverloadを有効に使っているモジュールを教えてください。
0536nobodyさん2008/12/16(火) 21:24:29ID:???
DateTime
0537nobodyさん2008/12/16(火) 21:26:06ID:???
>>535
http://search.cpan.org/dist/perl-5.10.0/lib/overload.pm
http://perldoc.jp/docs/perl/5.6.1/overload.pod
0538nobodyさん2008/12/16(火) 21:47:12ID:???
>>535
使用例としては、Math::BigIntが面白いと思う。
0539nobodyさん2008/12/17(水) 14:11:43ID:???
>>536-538
ありがとう。見てみる
0540nobodyさん2008/12/25(木) 22:41:08ID:???
Web::Scraperで質問です。

http://www.google.co.jp/m?eosr=on&q=hoge&site=mobile&mrestrict=chtml&start=0&sa=X&oi=blended&ct=more-results
の、検索結果に引っかかったURLを抽出しようと、以下のコードを書きました。

my $url = 'http://www.google.co.jp/m?eosr=on&start=0&site=mobile&sa=N&mrestrict=chtml&q=hoge';
my $scraper = scraper {
  process '.padbottom a', "link[]" => '@href';
  process '.sftr a', "next" => '@href';
  result qw/link next/;
};

my $uri = new URI($url . $word);
my $scraped = $scraper->scrape($uri);

for my $u (@{$scraped->{link}}) {
  print "$u\n";
}

結果は、10件の検索結果に加え、「次の10件」と「PCサイトを見る」のリンクまで取れてしまいました。
検索結果のクラスは<div class="padbottom">で、「次の10件」と「PCサイトを見る」のクラスは<div class="sftr center">なのに、何故この余計な二つが取れるのでしょうか?
どうすればこの余計な二つを除いた結果が取得できますか?
0541nobodyさん2008/12/28(日) 03:49:15ID:???
process '.padbottom .padbottom a', "link[]" => '@href';

って書けばよさそう。
いろいろ省かずに動くコードを gist に貼ってよ。
0542nobodyさん2008/12/30(火) 07:46:25ID:???
cronで走らせてるperlスクリプトを、時々任意に走らせたいときがあって、
webブラウザにアドレスを入れて、CGIを直接叩いているのですが、HTMLを返さないので、
ちゃんと実行されるものの、当然500エラーになります。

シェルから走らせてるか、HTTPで走らせてるかを判別できるような環境変数などはありますか?
0543nobodyさん2008/12/30(火) 08:02:24ID:???
$ENV{GATEWAY_INTERFACE}=~ /^CGI/ が真か偽か
0544nobodyさん2008/12/30(火) 08:11:45ID:???
>>543
thx;
0545nobodyさん2009/01/11(日) 00:46:35ID:???
1: 自分はこういう事がしたい。
携帯メールの添付ファイルをimagemagickで変換→送信元へ返信
2: それでこんな風にやってみたが・・・
A.メール受信してスクリプトを起動(実装済)
B.添付ファイルを抽出
C.添付ファイルをimagemagickで変換
D.変換後添付ファイルを送信元へ送信
(BCDは同一モジュール)
3: こんなエラーが出て上手く行かなかった。
Bの添付ファイルを抽出する処理において、ひとまず添付ファイルを出力してみようとしたところうまくいきません。
変更前(テンポラリファイルを作成するバージョン)はうまくいくのですが、$parser->output_to_core(1);にすると
うまく動きません(正常終了するけどファイルは作られない)。単純にoutput_to_core(1);とするだけではだめなのでしょうか?
#!/usr/bin/perl
use File::Basename;
use MIME::Parser;
my $parser = MIME::Parser->new
#$parser->output_dir('/tmp');  ←コメントアウト
$parser->output_to_core(1); ←追加
my $entity = $parser->parse(\*STDIN);
if($entity->is_multipart){
 $count = $entity->parts;
 for($i = 1; $i < $count; $i++){
  $path = $entity->parts($i)->bodyhandle->path;
  $filename = (fileparse($path))[0];
  open(FILE, "> /var/spool/mail/mail/$filename");
  print FILE $entity->parts($i)->bodyhandle->as_string;
  close(FILE);
 }
}

http://www.ksknet.net/cat28/mimeparser.html
0546nobodyさん2009/01/11(日) 23:01:08ID:lrs+Aq7A
一行づつプリントしたいのに、一気に出てきます(><)
どうすればいいですか?

#!/usr/bin/perl

use strict;
use Win32::Clipboard;
$| = 1;

my $clip = Win32::Clipboard();
$clip = $clip->GetText();
foreach (split(/\n/,$clip)) {
print $_;
sleep 1;
}
exit;
0547nobodyさん2009/01/11(日) 23:10:54ID:???
できたけど?
0548nobodyさん2009/01/11(日) 23:52:30ID:lrs+Aq7A
えーそうですか…。
どうしてだろう。
0549nobodyさん2009/01/12(月) 00:50:30ID:???
>546
\nでsplitしたんだからそりゃそーでしょう。

print "$_\n";
0550nobodyさん2009/01/12(月) 00:55:25ID:???
$|って何だろと思ってperlvar見て検索に引っかからなかった。
何故かパイプが全角だった。,とか\は半角なのに。
perl-5.8.8-15.el5_2.1
05515462009/01/12(月) 01:18:39ID:???
>>549
ありがとうございます! 気持ちよく眠れます!
0552nobodyさん2009/01/12(月) 01:24:58ID:???
Active Perl v5.10.0 Binary build 1004 の場合、無くても動いた。
バージョンによって違うのかねぇ。
0553nobodyさん2009/01/12(月) 01:27:12ID:???
winなんて知らんけど、\nじゃなくて\r\nだとか
でも\rだけで改行されんのかな
0554nobodyさん2009/01/12(月) 01:55:27ID:???
Win32::Clipboad経由では、改行が\x0d\x0aのまま渡ってきていたから、
splitかけても、各行の最後に\x0dが付いていた。

結果、左に復帰するけど、下にフィードしない。
ただし、1秒ごとに出力はされる。
という感じです。
0555nobodyさん2009/01/12(月) 10:07:30ID:???
546です。みなさんのおっしゃる通りです。
指摘されたように、print "$_\n";で応えてくれたので、
\r\nでsplitしました。
0556nobodyさん2009/01/14(水) 11:55:48ID:OW2Unehd
WinXP, ActivePerl5.8.8 です。
とある UFT-8 のファイルのデータを使って CSV ファイルを書き換えたいと思います。
そこで, まずCSV を読み込もうと
http://www.din.or.jp/~ohzaki/perl.htm#CSVwithCRLF
を参考に以下のソースを実行したのですが、何度やっても
「問題が発生したため、Perl Command Line Interpreter を終了します。 ご不便をおかけして申し訳ありません。」
というエラーが出て終了してしまいます。
+++++ソース+++++
use utf8;
use Encode;
open(DATA, '<', $entry_data_file) or die "entry_data does not exist.";
while (my $line = decode('CP932', <DATA>)) {
$line .= decode('CP932', <DATA>) while ($line =~ tr/"// % 2 and !eof(DATA));
$line =~ s/(?:\x0D\x0A|[\x0D\x0A])?$/,/;
@values = map {/^"(.*)"$/s ? scalar($_ = $1, s/""/"/g, $_) : $_}
($line =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g);
}
close(DATA);
+++++++++++++++++++
decode の仕方がいけないのでしょうか??
教えてください!!
05575562009/01/14(水) 12:12:28ID:OW2Unehd
CSVファイルのサイズは1MBくらいなので、
サイズが大きすぎるということではないと思うのですが、
何か分かれば教えてください!
0558nobodyさん2009/01/14(水) 12:37:25ID:???
まず、CSV処理がない部分のみでの挙動はどう?
あとはbinmode(DATA)もやってみてはどうだろう。
EUCの場合も試してみては?
0559nobodyさん2009/01/14(水) 12:47:48ID:???
$line .= decode('CP932', <DATA>) while ($line =~ tr/"// % 2 and !eof(DATA));

ここの行がだめな気がする
0560nobodyさん2009/01/14(水) 13:32:39ID:???
その手のエラーって処理系のバグ踏んだかメモリ使い果たしたかぐらいだろ。
環境晒したほうがいいかもね。windowsっぽいメッセージなので俺は力になれ
んと思うけど。

558の言うようにbinmode使えというのは同意。IOレイヤ使った方がいちいち
自前でencode書くよりすっきりするよ。元のプログラムいじるとこも最小限に
なるし。
0561nobodyさん2009/01/14(水) 17:04:33ID:???
5.8.8が無いので確証は無いけどメモリ使い果たしたエラーだと思う、多分。
0562nobodyさん2009/01/14(水) 17:10:52ID:???
メモリ使い果たすようなコード書くんじゃねー粕
0563nobodyさん2009/01/14(水) 17:13:41ID:???
俺なんて、レンタル鯖で3MくらいのCSVファイルをDB代わりに酷使してるけど、問題ないぜ
0564nobodyさん2009/01/14(水) 17:38:35ID:???
ようはコードの書き方次第
0565nobodyさん2009/01/14(水) 18:25:51ID:???
Perl6が都市伝説と聞いてやって来ました。
0566nobodyさん2009/01/14(水) 18:34:41ID:???
>>556
デバッグしろ!!
0567nobodyさん2009/01/14(水) 19:02:59ID:???
ダブルクォートがひとつ足りないだけで、永久ループになるんじゃないか?
OSがWindowsなら、ローカルで動かしてるか専鯖なんだろうし、
ファイルを全部読んでからText::CSV_XSで処理した方が楽だろう。
0568nobodyさん2009/01/14(水) 19:27:44ID:???
たとえダブルクォートがひとつ足りても足りなくてもファイルエンドになればループ条件を
満たさずにループから抜けるだろ
0569nobodyさん2009/01/14(水) 19:32:15ID:???
ああ、確かに。
呆けてた。
0570nobodyさん2009/01/14(水) 20:11:53ID:???
while (my $line = decode('CP932', <DATA>)) {

これって decode の結果がループ条件でしょ?
ここを

while (my $line = <DATA>){
my $utf8str = decode('CP932', $line);

みたいに分けたほうが・・・

あと、<DATA> で回してるのに、その中で <DATA> で読み込むのはやめた方がいい

これは作り方が間違えてるとしか・・・
0571nobodyさん2009/01/14(水) 20:55:18ID:???
わかって無い人が書いたらこうなりましたって典型例
0572nobodyさん2009/01/14(水) 21:10:32ID:VxBaEqTh
パールイズフリーダム〜〜〜
0573nobodyさん2009/01/15(木) 05:26:19ID:???
Active Perl 5.10では再現できず。
0574nobodyさん2009/01/16(金) 14:34:05ID:???
Perlのバージョンが単に悪いのか
動作環境が悪いのか
都市伝説が原因か


謎は深まるばかりです。
0575nobodyさん2009/01/17(土) 23:31:05ID:???
Perlは、「謎」という言葉でソースの悪さをごまかせる素敵な言語ですね!
0576nobodyさん2009/01/17(土) 23:48:40ID:???
あるクラスの中で、他クラスのサブルーチンを定義することは可能ですか?
イメージ的にはこんな感じです。

package main;
sub Hoge::say_hoge = sub say_hoge {warn "hoge\n"}
Hoge::say_hoge();
0577nobodyさん2009/01/18(日) 00:35:38ID:???
>>576
#!/usr/bin/perl -w
use strict;
package Foo;
sub Bar::speak { __PACKAGE__, ' says ', uc pop, "\n" }
package Bar;
sub Foo::speak { __PACKAGE__, ' says ', lc pop, "\n" }
package main;
print Foo::speak('FOO'), Bar::speak('bar');
__END__

ただしこんな事をしなければいけないようなら設計が悪い。
0578nobodyさん2009/01/18(日) 00:42:15ID:???
モジュールは単体で簡潔するべきかと
0579nobodyさん2009/01/18(日) 00:42:29ID:???
完結
0580nobodyさん2009/01/18(日) 02:00:40ID:???
Sub::Install::install_sub({
code => sub {warn "hoge\n"},
into => 'Hoge',
as => 'say_hoge'
});
0581nobodyさん2009/01/18(日) 02:09:03ID:???
>>577
サンプルありがとうございました。
0582nobodyさん2009/01/18(日) 14:33:21ID:???
自由にやるならClass::MOP辺りが面白いと思う。
0583nobodyさん2009/01/18(日) 20:51:31ID:???
>>577-578
おまえらの感想は求められていない。
聞かれたことだけに答えればよい。
0584nobodyさん2009/01/18(日) 23:39:26ID:???
1.txtの中身
a
b
c

2.txtの中身
d
e
f
↓一行おきに2.txtの中身を挿入したい
a
d
b
e
c
f

先生教えて!
0585nobodyさん2009/01/19(月) 00:00:53ID:???
use strict;
use warnings;

use FileHandle;

my $a = FileHandle->new("< a.txt");
my $b = FileHandle->new("< b.txt");

while (!$a->eof && !$b->eof) {
print $a->getline;
print $b->getline;
}
0586nobodyさん2009/01/19(月) 00:20:53ID:???
FileHandle使わんでもできるだろwww
0587nobodyさん2009/01/19(月) 00:46:38ID:???
> FileHandle使わんでもできるだろwww

FileHandle なり何なりを使わない場合の利点があれば教えて欲しい。
0588nobodyさん2009/01/19(月) 00:47:02ID:???
>>585
あざす
0589nobodyさん2009/01/19(月) 00:52:38ID:???
無駄に CPU 使うからイラネ
0590nobodyさん2009/01/19(月) 00:53:39ID:???
>>589
先輩もっと華麗に仕上げて下さい!
0591nobodyさん2009/01/19(月) 01:02:16ID:???
FileHandle使わない理由は分からんが、使わないならこんな感じかね

use strict;
use warnings;

open my $txta, '<', 'a.txt' or die 'not found a.txt';
open my $txtb, '<', 'b.txt' or die 'not found b.txt';

while (defined (my $ta = <$txta>) and defined (my $tb = <$txtb>)) {
  print $ta;
  print $tb;
}
0592nobodyさん2009/01/19(月) 08:55:47ID:???
無駄に CPU 使うからいらないという理由をもってくると、
use strict; つけることすら無駄になるよね。
どうなのそれ。
0593nobodyさん2009/01/19(月) 09:02:22ID:???
え、俺デバッグ終わったらstrict外すけど
0594nobodyさん2009/01/19(月) 09:08:59ID:???
えぇええええええええええええええええええええええええっ!!
strictはプラグマだから負荷かからないと思ってたけど違うの?
数値的にどれくらい負荷になるの?
0595nobodyさん2009/01/19(月) 09:09:55ID:???
3日後に読めないような汚いコードしか出てこないスレだし
use strict してなくてもかまわんかもしれんなw
0596nobodyさん2009/01/19(月) 09:21:58ID:???
http://naoya.dyndns.org/~naoya/mt/archives/000892.html

以下コピペするよ

> ところで、気になるオブジェクト指向実装における Perl スクリプトの実行
> 速度ですが、Damian Conway 氏による『オブジェクト指向Perlマスターコー
> ス―オブジェクト指向の概念とPerlによる実装方法』の序章にこうあります。
>
> > 一般には、オブジェクト指向Perlによるシステムの実装は、それと等価の
> > 非オブジェクト指向実装よりも高速になることはなく、実際には比較して
> > 通常20〜50パーセントほど低速になる。
> > この数字はオブジェクト指向Perlから多くのユーザを遠ざけるほど十分に
> > 大きいかもしれないが、オブジェクト指向の設計面および実装面のそれを
> > 補うさまざまなり点を見逃すのは悲劇的である。
> > (中略)
> > 残念ながら多くの人は、「20〜50パーセントの低速化」という数字に惑わ
> > され、過去6か月間でプロセッサ速度が2倍になったにもかかわらず、何を
> > 意味しているか忘れがちになる。
0597nobodyさん2009/01/19(月) 09:28:43ID:???
今 perl 使ってる人って、
(1) CGI を速度重視で修行のように書く perl
(2) Moose とか使う oop perl
のどちらかだと思う。

(1) で use strict なしとかだと首つるしかなくね?
0598nobodyさん2009/01/19(月) 09:34:37ID:???
http://blog.livedoor.jp/dankogai/archives/50502585.html

世の中にはおかしな本もあるようでwww
0599nobodyさん2009/01/19(月) 09:37:37ID:???
use strictなしで正しいプログラムを書ける人には不要らしい。

俺には無理。
0600nobodyさん2009/01/19(月) 09:44:29ID:???
use strict 不要派って、
「趣味のプログラムだから、最悪バグっても構わない」
的なこと書いて逃げるよね。
どうしようもない奴らであることは確かだな。

馬鹿はおとなしくマークアップエンジニアとかやってればいいのにな。
0601nobodyさん2009/01/19(月) 11:17:25ID:???
use strictしないで作ったショッピングカートで注文受けてるわw
0602nobodyさん2009/01/19(月) 12:00:06ID:???
俺はKENT様が作ったショッピングカートを使ってる
0603nobodyさん2009/01/19(月) 12:03:05ID:???
KENT って書くと笑いが取れると思ってる?
つまんないから馴れ合い irc で引きこもっとけよ。
0604nobodyさん2009/01/19(月) 12:25:52ID:???
>>601
DBがプレーンテキストのカートシステムで注文受けてる
0605nobodyさん2009/01/19(月) 12:44:11ID:???
>>604
もちろん同じですよw

客の個人情報もテキストだよな?
流石にhtaccessでアクセス制限は敷いているが
0606nobodyさん2009/01/19(月) 12:49:52ID:???
htaccessで?
httpdから見えるところに置いてるのか
0607nobodyさん2009/01/19(月) 12:52:42ID:???
>>605
売り上げ毎に個別のID付けて、売り上げデータだけサーバに残し、
個人情報は残さない。
個人情報+個別IDをメールで自分に送る。
0608nobodyさん2009/01/19(月) 13:11:12ID:???
>>606
レンタル鯖なんだから、httpdから見えないところには置けない・・・と思う。
>>607
メールで個人情報送るのって、案外危ないのでは?
俺は客宛に自動送信するメールにも、住所とかは完全な形では書かないよ
0609nobodyさん2009/01/19(月) 13:14:35ID:???
>>608
httpd から見えるところにデータ置いておく人のやることは矛盾だらけだということがわかった。w
0610nobodyさん2009/01/19(月) 13:17:35ID:???
>>608

root
web
log

みたいなディレクトリ構造になってないの?
0611nobodyさん2009/01/19(月) 13:20:29ID:???
>>610
確かにそんな感じだから、やろうと思えばできるのかなあ・・
0612nobodyさん2009/01/19(月) 13:23:40ID:???
>>608
ヤフオクだって取引ナビはSSLではないしね
大量に抜き取られる心配は無いね
0613nobodyさん2009/01/19(月) 13:23:42ID:???
>>611
> やろうと思えばできる

じゃなくて、できないのなら廃業するべき。
0614nobodyさん2009/01/19(月) 13:29:05ID:???
レン鯖を使うところがそもそも間違ってるんだけど、安全な自鯖を立てる技術がない以上、
レン鯖を使うのが今の俺に取ってはベターだとは思ってる。
最悪、なにか事故が起こったら謝ってしまえばいいだけ。

本題に戻れば、カートをどんな方法で動かしてるかとか、内部仕様的なところは客には見えないから、
ちょっと見栄えのする画面だったら何でもいいんだよw

まあレン鯖だということは分かっちゃうことになるけど、そんなこといちいち調べて買い物しないでしょ?
0615nobodyさん2009/01/19(月) 13:32:35ID:???
>>614
わざわざ負け犬表明しなくていいですよw
06166122009/01/19(月) 13:36:00ID:???
よく考えたら、メールは大概 SSL/TLS で暗号化されているか。
0617nobodyさん2009/01/19(月) 13:36:40ID:???
> 本題に戻れば、カートをどんな方法で動かしてるかとか、
> 内部仕様的なところは客には見えないから、

どこかで配布されてるスクリプトをちょっといじっただけの程度なら
内部仕様バレバレでっせw

もうすでに流出してるかもわからんね。

クレカの大量不正利用がある日起こってみんな気がつくとw
0618nobodyさん2009/01/19(月) 13:37:21ID:???
>>616
> よく考えたら、メールは大概 SSL/TLS で暗号化されているか。

デマですか?
0619nobodyさん2009/01/19(月) 13:38:54ID:???
>>616
客のIDとパスワードが、何らかの理由で漏れたときに、注文時のメールアドレス変えて
第三者に漏れる可能性があるかなという理由なんだよ。
0620nobodyさん2009/01/19(月) 13:40:17ID:???
>>617
スクリプトは1から自分で書いたよ。だから怪しいわけだけどw
クレカなんて扱わないよ、そこまで大規模なら、システムにも金かけるでしょ。
0621nobodyさん2009/01/19(月) 13:40:25ID:???
低脳なウェブエンジニア(笑)の皆さんがいると聞いて飛んできました
0622nobodyさん2009/01/19(月) 13:41:33ID:???
> クレカなんて扱わないよ、そこまで大規模なら、システムにも金かけるでしょ。

クレカ扱うと大規模なの?w
06236122009/01/19(月) 13:49:40ID:???
>>619
そーゆー事か。
うちは、会員制(登録制)にしていないから、IDもPASSも無い。

>>618
大概はいいすぎたか。うちはメールサーバーと自宅の間は大丈夫。
ttp://www.rhein-strasse.de/blog/2004/06/19/becky2-ssl-tls/
■ このスレッドは過去ログ倉庫に格納されています