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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2007/05/30(水) 11:34:01ID:???
Perlのコーディングで困ってる人のスレです。

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

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

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

お勧めサイトは >>2-10

前スレ http://pc11.2ch.net/test/read.cgi/php/1171102883/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0152nobodyさん2007/06/18(月) 00:46:35ID:???
ログイン時に受信すればいい
0153nobodyさん2007/06/18(月) 05:55:05ID:???
151 さんは、メールを送った直後に自動更新されることを期待していると思うんだ。
152 みたいなバカは死ぬとよい。
0154nobodyさん2007/06/18(月) 06:31:20ID:???
>>151 = >>153
バカな153のせいで、151の質問に答える奴はいなくなりましたとさ(終)
0155nobodyさん2007/06/18(月) 06:32:06ID:???
>>152 == >>154 ?
0156nobodyさん2007/06/18(月) 06:45:55ID:???
ここまで俺の
01571542007/06/18(月) 07:36:43ID:???
>>155
まぁ、そうくるだろうと思ったよ。マジレスすると152は漏れじゃない。
信じなくても良いけど、>>153を援護すればする程、>>151の質問に
答える奴はいなくなるよ?(w
0158nobodyさん2007/06/18(月) 07:57:34ID:???
ここまで俺の
0159nobodyさん2007/06/18(月) 08:46:27ID:???
神経戦乙
0160nobodyさん2007/06/18(月) 09:05:53ID:???
> 答える奴はいなくなるよ?(w

答える能力はないが煽っていますということ?
0161nobodyさん2007/06/18(月) 09:30:18ID:???
qmailならhomeディレクトリにメール受信時にスクリプトを動作させることはできるが、
他のメールサーバーでも同じことはできるかと思う
0162nobodyさん2007/06/18(月) 13:27:43ID:???
答える答えない以前に、Perlの質問じゃないから。
0163nobodyさん2007/06/18(月) 13:29:32ID:???
> 答える答えない以前に、Perlの質問じゃないから。

それがどうしたの?
0164nobodyさん2007/06/18(月) 13:59:19ID:???

それがどうしたの、と言われましても…
ここはPerl"コーディング"質問スレな訳ですし。
ロジック的なことを聞きたいのならば、
この板にも適切なスレッドがありますし、
更に深い内容ならUNIX板とかに行けば良いでしょう。
しかし、そのロジックを理解した上でのコーディングに関する
質問はスレ違いではありませんが、レベル的に
"自分で考えれば分かる"程度なので、処理をアシストする
モジュールくらいしか案内出来ないでしょう。
少なくとも 151 の書き込みを読む限りでは。
0165nobodyさん2007/06/18(月) 14:18:33ID:???
>>153>>152 を煽る理由がわからん
152 が質問者なのか
違うのなら質問に答えると思うが
0166nobodyさん2007/06/18(月) 14:47:39ID:???
上島竜平は まで読んだ。
0167542007/06/18(月) 15:51:47ID:???
>>152-155まで皆氏ねば済む話じゃないか
0168nobodyさん2007/06/18(月) 15:52:52ID:???
名前欄誤爆った…54ってorz
0169nobodyさん2007/06/18(月) 16:14:07ID:???
情けない質問するやつも氏ねば済むんじゃね?
0170nobodyさん2007/06/18(月) 16:21:21ID:???
メール着信でスクリプトをキックする方法は、管理者に訊いた方がいい。
システム構成によって方法が違うから。
禁止されてるかも知れないし、maildropが使われてるかも知れない。

ここからPerlコーディングについての質問。
0171nobodyさん2007/06/18(月) 18:46:23ID:???
もうバレバレじゃん(w
>>153を援護する奴が>>151(質問者)だろ?
大体、質問した奴がこの流れで16時間も静観してる訳無いだろ?
しかも口調が一緒だし(w

>>151 = >>153 = >>155 = >>160 = >>163

質問に答えてもらおうと必死。
0172nobodyさん2007/06/18(月) 19:28:33ID:???
>>171
スレ違い
0173nobodyさん2007/06/18(月) 19:32:33ID:???
+= >>172
0174nobodyさん2007/06/18(月) 19:39:27ID:???
my $intAnchor = 1;

while( $intAnchor < 1001 ) {
>>172 += $intAnchor;
$intAnchor++;
}
0175nobodyさん2007/06/18(月) 19:57:19ID:???
0176nobodyさん2007/06/18(月) 20:07:15ID:???
いや>>151 = >>153 = >>155 = >>160 = >>163も十分見苦しいけど、
>>152 = >>154 = >>157 = >>165 = >>171もなんか必死すぎて嫌いだ
お前ら皆どっかいっちゃえ!!!11
0177nobodyさん2007/06/18(月) 21:04:16ID:???
>>151
CGIで読むってことは、CGIがメーラー(POPクライアント)の役割をするわけだから、
CGI起動時にメールボックスから届いたメールを読み出せばいいのでは。
Net::POP3でも使ったらどうですか? 読み出したらサーバから削除するなどの
処理はすべて自分で書く必要があります。GUIのないメーラーを作るようなもんです。
…ていうことではなくて、届いたタイミングで、届いたメールデータを処理したい
ってことかしら。であれば、perlというよりは、.forwardまたはdot-qmailファイル
にでもプログラムにパイプで渡す設定をしておけば、プログラムから標準入力
を読んで処理すれば済む。MIME::Parserを使うと便利。
まずはコードを書いてみることです。
0178nobodyさん2007/06/18(月) 21:31:22ID:???
素朴な疑問。
CGIで、場合によってLocationヘッダを返した場合、
ユーザからみると、即座にページを飛ばされるんですが、
そのCGIはLocationヘッダを返したあともexitしない限り、
以後の処理をし続けるんでしょうか。
0179nobodyさん2007/06/18(月) 21:41:57ID:???
#!/usr/bin/perl

use strict;
print "Location: http://www.yahoo.co.jp/\n\n";
sleep(10);
exit;
0180nobodyさん2007/06/18(月) 21:45:01ID:???
どうも。確かめる方法がわかりました。つまらん質問すみません。
飛ばした後にファイル出力できたので、ちゃんと最後まで処理しますね。
てことは飛ばした場合もちゃんとexitしたほうが無駄が少ないということ
ですよね??
0181nobodyさん2007/06/18(月) 21:57:32ID:???
きみの言う無駄とは?
0182nobodyさん2007/06/18(月) 22:27:24ID:???
ああ、そういう突っ込みになりますよね。無駄があるのは僕だけの事情でした。
例えば、通常、ウェブページをきちんと出力するルーチンの途中で例外的に
飛ばした場合の、その後のページ出力処理、とか。
0183nobodyさん2007/06/18(月) 23:07:27ID:???
179さんの言ってる意味がいま解りました。最後まで処理しないと
飛ばないんですね。面目ない。
0184nobodyさん2007/06/18(月) 23:15:58ID:???
そりゃ単にバッファをフラッシュしてないだけだろ
01851512007/06/18(月) 23:52:23ID:k4WptDOc
質問の仕方等々で至らぬ点があり、なんだか揉めてしまったようで申し訳ないです。
普通に帰るのが遅い人間&出先から書きにくい状態でした。

意図としては>>177さんが書いてくださったような、
「届いたタイミングで、届いたメールデータを処理したい」、
つまり、メールを受けたことをトリガとしてバックエンドの処理を動かすという
というものでした。
例えば、メールで「1+1」と送ると、バックエンドで計算処理をして、
答えを「2」で返す、というような。

ご指摘いただいたように、Perlコーディングという内容ではないので、
いただいたお答えを元に、うちの環境で確かめることにしてみます。

ほんとうにありがとうございました。
0186nobodyさん2007/06/20(水) 13:54:26ID:???
改行を含む文字列の中の一部分を取りたいときに、直近の改行コードまでという指定は出来ないものでしょうか?

kani
kanimiso@
kanikama

上のような文字列(@部分がいろいろ変わる)からmiso@を抜き出したいんだけど

s/.*kani(.*)\n/$1/;

みたいにするとmiso@\nkanikama\nまでが取れてしまいます。
0187nobodyさん2007/06/20(水) 14:25:25ID:???
最短マッチとかs修飾子とか
0188nobodyさん2007/06/20(水) 14:53:02ID:???
最短マッチで出来ました。ありがとうございました。
0189nobodyさん2007/06/20(水) 18:37:42ID:???
中身が空っぽもしくは
<html>
<head></head>
<body>
</body>
</html>
になってるファイルに<p>hogehoge</p>を書き込んで
<html>
<head></head>
<body>
<p>hogehoge</p>
</body>
</html>
にしたいのですがどうしたらよいでしょうか。
0190nobodyさん2007/06/20(水) 18:40:27ID:???
>>1
0191nobodyさん2007/06/20(水) 18:40:41ID:???
質問ってレベルじゃねえぞ…
0192nobodyさん2007/06/20(水) 18:40:54ID:???
>>189
それだけの条件なら何も考えずに最終結果を固定で上書きするだけでいいんじゃねーの?
0193nobodyさん2007/06/20(水) 18:43:32ID:???
すみません>>189に追加させてください

<body>〜</body>に<p>hogehoge</p>以外に既に何か文字が入っていても
それを消さずにその下に追記するようにしたいのです。
<body>
<p>fugafuga</p>
</body>

<body>
<p>fugafuga</p>
<p>hogehoge</p>
</body>
こんな感じです
0194nobodyさん2007/06/20(水) 19:04:32ID:???
HTML::Templateでも使っとけよ・・・
0195nobodyさん2007/06/20(水) 20:24:57ID:???
open(FILE,"<index.html");
my $html = <FILE>;
close(FILE);
$html =~ /<\/body>/;
my $top = $`;
my $bottom = $';

$top .= "<p>追加する文字列</p>\n";
$top .= $bottom;

open(FILE,">index.html");
print <FILE> $top;
close(FILE);

exit;

This is not confident.
Please point it out when the mistake is found.
0196nobodyさん2007/06/20(水) 21:07:55ID:???
perl -MIO::All -e '($tmp = ${io("index.html")}) =~ s{(</body>)}{<p>hogehoge</p>$1}, $tmp > io("index.html")';
0197nobodyさん2007/06/20(水) 21:32:55ID:???
perl -0777 -i.bak -pe 's{(</body>)}{<p>hogehoge</p>\n$1}' index.html
0198nobodyさん2007/06/20(水) 22:14:26ID:???
>>189です。みなさんありがとうございます。
ご飯食べてお風呂入ってるあいだ自分でもこんなの思いついたんですけど
>>195さんのとかのほうがスマートでしたね

if (-e $xmlfile && -s $xmlfile) {

open (FILE, "<test.htm") or die "$!";
@file = <FILE>;
close (FILE);

foreach $line (@file){
if($line =~ /<\/body>/){
$line =~ s/$追加する文字列\n$&/;
}
}

open (FILE,">test.htm");
print FILE @file;
close(FILE);

} else {

open (FILE, ">test.htm") or die "$!";
print FILE "<html>\n<head>\n</head>\n<body>\n$追加する文字列</body>\n</html>\n";
close (FILE);

}

0199nobodyさん2007/06/20(水) 22:45:40ID:???
/<\/body>/ こんな書き方する馬鹿は氏ねばいいのに!
0200nobodyさん2007/06/20(水) 23:06:37ID:???
>>199
だめなの?
0201nobodyさん2007/06/20(水) 23:09:39ID:???
>>199
そこまでは思わんが、実行するまでもなくグダグダな195に
195を実行せずにレスする質問者を見るとなあ。
0202nobodyさん2007/06/21(木) 00:03:24ID:???
>200
if ($line =~ m{</body>})
こんな感じにしたほうが読みやすいだろ、ってこと
0203nobodyさん2007/06/21(木) 00:04:59ID:???
いや
別にいいだろwww
0204nobodyさん2007/06/21(木) 00:15:52ID:???
それだけで氏ねとか言われたならなんだかちょっぴりかわいそすwww
0205nobodyさん2007/06/21(木) 00:35:30ID:???
基本だろ。大丈夫か?
ってまた彼が言ってるだけか。
0206nobodyさん2007/06/21(木) 01:03:59ID:???
>>189へのレスのシカトっぷりと、結局自分で書けた(=質問する意味ね
えじゃん)って事と、>>195のふざけた態度みて(なにが添削しろだよ、
せめてsyntax errorなくしてからレスれ)寛大で居られるおまえらは凄い。

氏ねとは思わんが消えろとは思うぞ、心の底から。
0207nobodyさん2007/06/21(木) 01:06:53ID:???
Template
0208nobodyさん2007/06/21(木) 01:09:30ID:???
>>206のキレっぷりも凄いがなw
>>195の最後の2行は「これ自信無い。間違ってたら指摘して」って事じゃねぇの?
0209nobodyさん2007/06/21(木) 01:15:30ID:???
>>189は釣りだったってことで
0210nobodyさん2007/06/21(木) 01:17:03ID:???
>>195は回答者としては初心者(良回答とは言えない)だろうが、
一応>>193の答えにはなってるからいいんじゃないのか?
自分で書けた〜のくだりは同感だが、そんなのにいちいち目くじら立ててもな。
ついでに言うと、>>206は海外に行かない方が良さそうだな。
0211nobodyさん2007/06/21(木) 01:20:11ID:???
>>210
syntax error出るのが答えなの?
要件にも沿ってないよ。実行してみ?
0212nobodyさん2007/06/21(木) 01:25:23ID:???
>>208
正確な和訳は出来てたが、つい勢いで。
>>210
どっちかってーと質問者よりも195の方が消えて欲しい。
一回くらいは実行してから、レスするのが礼儀じゃないか?
特に自信ないならなおさら。

最後の一行は同意。
0213nobodyさん2007/06/21(木) 01:27:55ID:???
>>208
そう書いたつもりなんだろうけど「俺じゃなくてこのコードさんが、自信がない、と」に
なってたりでいろいろアレなことになってる。

>>206
俺は寛大じゃないけどめんどくさいので>>195はほったらかしてた。

>>210
辞書で confident 引いて用例眺めろ、ってあんたに言えば>>195に伝わりそうな気がする。
0214nobodyさん2007/06/21(木) 01:53:11ID:???
質問者が自己解決するまでに
ろくな回答もできない低脳どもの集まるスレはここですか?
0215nobodyさん2007/06/21(木) 10:11:00ID:???
違う。
お前が一人で荒らしてるスレ。
0216nobodyさん2007/06/21(木) 10:22:50ID:???
これだからPerlはwww
tp://0-9.sblo.jp/article/4439458.html
0217nobodyさん2007/06/21(木) 10:28:38ID:???
>>194
0218nobodyさん2007/06/21(木) 13:21:32ID:???
"1,21,10,100,1"のようにランダムに数字が入った文字列の中で
「1」という要素が含まれているかどうかを知りたいのですが、
splitで配列化してハッシュに入れる方法以外には無いでしょうか?

最短マッチで

$data = '1,21,10,100,1';
if ($word =~ /(1?,)/) { print "存在します¥n"; }

とやったら最後にある「1」がチェックできませんでした。
0219nobodyさん2007/06/21(木) 13:47:27ID:???
色々勘違いしてそうだから「最短マッチ」でググるといいよ
それと$dataと$wordのtypo
0220nobodyさん2007/06/21(木) 13:53:22ID:???
おまえら魚でも食って落ち着けよ
0221nobodyさん2007/06/21(木) 14:35:54ID:???
if (grep { $_ eq '1' } split(/\,/, $data)) { print "存在します\n"; }
0222nobodyさん2007/06/21(木) 14:51:26ID:???
/1(,$)/じゃダメ?
02232182007/06/21(木) 14:57:47ID:???
>>219
ググって勉強し直しました。typo_| ̄|○
文字列なのだからわざわざ分割せずに正規表現を使って調べる方法は無いかと
思ったのですが、素直に分割した方が早そうですね。
221さんもありがとうございました。
0224nobodyさん2007/06/21(木) 16:08:32ID:???
if($data =~ m/1/g){print"存在します\n"}
0225nobodyさん2007/06/21(木) 16:14:09ID:???
/\b1\b/
0226nobodyさん2007/06/21(木) 16:22:39ID:???
print "存在します\n" while($data =~ m/\b1\b/g);
0227nobodyさん2007/06/21(木) 16:28:11ID:???
if($data =~ /^1,|,1,|,1$/){ print "true \n"; }
0228nobodyさん2007/06/21(木) 16:52:54ID:???
>>216
>CGI.pmをラップしてMyCGI.pmを作った。
>CGI::Varsを上書きして定義し、最後に「return $this->SUPER::Vars()」とかした。
>帰ってきたのはhashに見える別物。参照を突っ込むと「'ARRAY(nnnn)'」って文字列で保存しやがる。
>保存できねぇなら半端にやらずにいっそ死んでくれ。。。

ってどういうこと?
0229nobodyさん2007/06/21(木) 17:06:27ID:???
質問です。
CGIの処理で、別のCGIを呼び出すにはどうしたらいいのでしょうか?
例えばセッションを確認して、有効じゃなかったので、ログインページを表示するCGIに
飛ばす場合などです。
現状ではレスポンスヘッダーのlocationに、呼び出したいCGIのパスを指定して渡していますが、
そうするとサーバはperlの起動を2回してることになって負荷的にスマートじゃない気がします。
何か定番のやり方があれば教えてください。
0230nobodyさん2007/06/21(木) 17:22:50ID:???
>>229
俺はlocationにしてるな。
locationをブラウザに渡してからリクエストを受けるから2回起動してるわけじゃないぞ。
0231nobodyさん2007/06/21(木) 17:33:17ID:???
うちもlocationだなー。
で、飛ばす先(CGI)へのパラメータとして、元のページのURLを渡す。
0232nobodyさん2007/06/21(木) 17:40:38ID:???
>>228
「ぼくは頭が悪すぎるから死にたい」ってことじゃね?
0233nobodyさん2007/06/21(木) 17:41:43ID:???
>>228
ログインページ表示を切り出しておいて呼び出すとか。
02342332007/06/21(木) 17:43:15ID:???
×>>228
>>229
0235nobodyさん2007/06/21(木) 18:33:45ID:e31j4SZZ
use strict;
の必要性について教えて下さい。
色んなサイトを見てみても、書いてあることがまちまちで混乱しています。
要はグローバル変数を認めないということだと理解しているのですが、
それは変数名をタイプミスすることによるエラーの回避や
可読性を考慮してのことなのでしょうか?
それともその他に重要な部分があるのでしょうか?
例えば、
$hoge = '2ch';
print $hoge;
という内容で、どこからも呼び出されないfuga.cgiがあった場合、
use strict;
my $hoge = '2ch';
print $hoge;
とする必要性はあるのでしょうか?
0236nobodyさん2007/06/21(木) 18:42:32ID:???
2行なら一目でわかるのでいらないという考え方もあるし、普段から
習慣をつけておくという意味ではやっといたほうがいいという人も
いる。好きにしろ。
0237nobodyさん2007/06/21(木) 18:43:32ID:???
つーかどこからも呼び出されないCGIならそもそも存在する必要ないっしょ
0238nobodyさん2007/06/21(木) 18:43:38ID:???
それは変数名をタイプミスすることによるエラーの回避や
可読性を考慮してのことなのでしょうか?

↑で9割正解かと
0239nobodyさん2007/06/21(木) 18:53:29ID:???

Template Toolkit で EVAL_PERL オプションを付け、
テンプレートの中にPERLのコードが書けるようにしました。
で、下記のように書いてテンプレートフォルダ内の count.txt を読み込むよう記述したのですが
その内容が全く出力されませんでした。
Template Toolkitではパールのコードは書けるけどファイルハンドルは扱えない等、
そういう制限があったりするのでしょうか?

[% PERL %]
open FH,"count.txt";
my @count = <FH>;
print @count;
close FH;
[% END %]
02402352007/06/21(木) 18:59:48ID:???
>>236
これから新たに書く場合は心掛けた方が良いけど
既に書き上げてしまったものの中で、自分でコードを全て把握しており
第三者に読ませることがないものについては放置でも良い
という方針でいこうと思います。

>>237
「そのCGIだけで完結していて、他のCGIから呼び出されない」という意味です。

>>238
ありがとうございます。
「とりあえずuse strict;は必須!」と書いてあるところは多いのですが
そのメリットやデメリットについてまで詳しく書かれているところは少なく
自分の理解が合っているのか不安だったので助かりました。
0241nobodyさん2007/06/21(木) 19:05:29ID:???
>>239
そんな制限はきいたこともないな。よくわからんがファイル開けて
ないんじゃねーの?

printやcloseのエラーまで厳密にチェックしろとまではいわないが、
openのエラーチェックだけは省略しないほうがいいよ。
0242nobodyさん2007/06/21(木) 19:18:14ID:???
>>239
ありがとうございます。
エラーチェックしてみたところ、openの段階でファイルが開けていませんでした。
しかしパスも間違えていないのに何故に開けないんだか。。
原因不明です(´・ω・`)
0243nobodyさん2007/06/21(木) 19:19:16ID:???
すいませんアンカ間違えました。
>>241さんです。
0244nobodyさん2007/06/21(木) 19:52:32ID:???
>>239
ちょこっと検証したけど挙動が変だわw
何れも当環境下なので、あなたの所で上手く行くかどうかは保証外。
以下、成功例
#!/usr/bin/env perl -w
use strict ;
use Template ;
my $tt = Template->new({ EVAL_PERL => 1}) ;
$tt->process(\*DATA, ) ;
__DATA__
[% PERL %]
open FH , 'hoge.pl' or die ;
my @line = <FH> ;
close FH ;
print @line ;
[%- END -%]

'hoge.pl' という名前で保存。これは上手く動いた。ちなみに $/ が undef されてるっぽいので、
@line を $line に変更しても動く。最終改行の制御がどうしても一個多かった。
02452442007/06/21(木) 19:54:53ID:???
失敗例。

my $tt = Template->new({ EVAL_PERL => 1}) ;
$tt->process(\<<"EOF", ) ;
[% PERL %]
open FH , 'hoge.pl' or die ;
my @line = <FH> ;
close FH ;
print @line ;
[% END %]
EOF

Possible unintended interpolation of @line in string at hoge.pl line 9.と
Global symbol "@line" requires explicit package name at hoge.pl line 9.が出る。
かといって my @line を普通に先に宣言しても上手く動かない。
0246nobodyさん2007/06/21(木) 20:22:49ID:???
事故レス。'EOF' にしたら動いた、、、、orz...
0247nobodyさん2007/06/21(木) 20:24:59ID:???
>>245
それはttが動く以前の話だろ。

use strict;
print <<"EOF";
@line
EOF

と同じこと。
0248nobodyさん2007/06/21(木) 20:35:19ID:???
>>244さん
わざわざ検証して下さってありがとうございます!
環境の違いがありますが試してみます!
大変参考になりました、感謝です!
0249nobodyさん2007/06/21(木) 21:06:24ID:???
>>247
> かといって my @line を普通に先に宣言しても上手く動かない。
ってこっちの例を出すべきでしたね。失礼。
02502442007/06/21(木) 22:19:28ID:???
ああ、復活した!
アホでした。245以降の私の戯言は消去してください。バルス!!
ああああああ、穴があったら入りたい。ったらありゃしない。
0251nobodyさん2007/06/21(木) 23:04:05ID:???
unless(open(FILE,"<test.dat")){&error();}
flock(FILE,2);
my @test = <FILE>;
flock(FILE,8);
close(FILE);

として、test.dat(↓)を読み込み、
テスト1
テスト2
テスト3


unshift(@test,"テスト\n");

と先頭に文字列を追加して

unless(open(FILE,">test.dat")){&error();}
flock(FILE,2);
print FILE @test;
flock(FILE,8);
close(FILE);

という様に書き込んだのですが、見てみると

テスト4 テスト1
テスト2
テスト3

の様に改行されず出力されている様ですが、これは何故でしょうか?
■ このスレッドは過去ログ倉庫に格納されています