Perlコーディング初心者質問スレ Part 55
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2007/05/30(水) 11:34:01ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >>2-10
前スレ http://pc11.2ch.net/test/read.cgi/php/1171102883/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0174nobodyさん
2007/06/18(月) 19:39:27ID:???while( $intAnchor < 1001 ) {
>>172 += $intAnchor;
$intAnchor++;
}
0175nobodyさん
2007/06/18(月) 19:57:19ID:???0176nobodyさん
2007/06/18(月) 20:07:15ID:???>>152 = >>154 = >>157 = >>165 = >>171もなんか必死すぎて嫌いだ
お前ら皆どっかいっちゃえ!!!11
0177nobodyさん
2007/06/18(月) 21:04:16ID:???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:???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:???飛ばないんですね。面目ない。
0184nobodyさん
2007/06/18(月) 23:15:58ID:???0185151
2007/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:???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>
にしたいのですがどうしたらよいでしょうか。
0191nobodyさん
2007/06/20(水) 18:40:41ID:???0193nobodyさん
2007/06/20(水) 18:43:32ID:???<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:???0195nobodyさん
2007/06/20(水) 20:24:57ID:???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:???0197nobodyさん
2007/06/20(水) 21:32:55ID:???0198nobodyさん
2007/06/20(水) 22:14:26ID:???ご飯食べてお風呂入ってるあいだ自分でもこんなの思いついたんですけど
>>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:???0202nobodyさん
2007/06/21(木) 00:03:24ID:???if ($line =~ m{</body>})
こんな感じにしたほうが読みやすいだろ、ってこと
0203nobodyさん
2007/06/21(木) 00:04:59ID:???別にいいだろwww
0204nobodyさん
2007/06/21(木) 00:15:52ID:???0205nobodyさん
2007/06/21(木) 00:35:30ID:???ってまた彼が言ってるだけか。
0206nobodyさん
2007/06/21(木) 01:03:59ID:???えじゃん)って事と、>>195のふざけた態度みて(なにが添削しろだよ、
せめてsyntax errorなくしてからレスれ)寛大で居られるおまえらは凄い。
氏ねとは思わんが消えろとは思うぞ、心の底から。
0207nobodyさん
2007/06/21(木) 01:06:53ID:???0210nobodyさん
2007/06/21(木) 01:17:03ID:???一応>>193の答えにはなってるからいいんじゃないのか?
自分で書けた〜のくだりは同感だが、そんなのにいちいち目くじら立ててもな。
ついでに言うと、>>206は海外に行かない方が良さそうだな。
0212nobodyさん
2007/06/21(木) 01:25:23ID:???正確な和訳は出来てたが、つい勢いで。
>>210
どっちかってーと質問者よりも195の方が消えて欲しい。
一回くらいは実行してから、レスするのが礼儀じゃないか?
特に自信ないならなおさら。
最後の一行は同意。
0213nobodyさん
2007/06/21(木) 01:27:55ID:???そう書いたつもりなんだろうけど「俺じゃなくてこのコードさんが、自信がない、と」に
なってたりでいろいろアレなことになってる。
>>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:???tp://0-9.sblo.jp/article/4439458.html
0218nobodyさん
2007/06/21(木) 13:21:32ID:???「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:???0222nobodyさん
2007/06/21(木) 14:51:26ID:???0223218
2007/06/21(木) 14:57:47ID:???ググって勉強し直しました。typo_| ̄|○
文字列なのだからわざわざ分割せずに正規表現を使って調べる方法は無いかと
思ったのですが、素直に分割した方が早そうですね。
221さんもありがとうございました。
0224nobodyさん
2007/06/21(木) 16:08:32ID:???0225nobodyさん
2007/06/21(木) 16:14:09ID:???0226nobodyさん
2007/06/21(木) 16:22:39ID:???0227nobodyさん
2007/06/21(木) 16:28:11ID:???0228nobodyさん
2007/06/21(木) 16:52:54ID:???>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:???俺はlocationにしてるな。
locationをブラウザに渡してからリクエストを受けるから2回起動してるわけじゃないぞ。
0231nobodyさん
2007/06/21(木) 17:33:17ID:???で、飛ばす先(CGI)へのパラメータとして、元のページのURLを渡す。
0235nobodyさん
2007/06/21(木) 18:33:45ID:e31j4SZZの必要性について教えて下さい。
色んなサイトを見てみても、書いてあることがまちまちで混乱しています。
要はグローバル変数を認めないということだと理解しているのですが、
それは変数名をタイプミスすることによるエラーの回避や
可読性を考慮してのことなのでしょうか?
それともその他に重要な部分があるのでしょうか?
例えば、
$hoge = '2ch';
print $hoge;
という内容で、どこからも呼び出されないfuga.cgiがあった場合、
use strict;
my $hoge = '2ch';
print $hoge;
とする必要性はあるのでしょうか?
0236nobodyさん
2007/06/21(木) 18:42:32ID:???習慣をつけておくという意味ではやっといたほうがいいという人も
いる。好きにしろ。
0237nobodyさん
2007/06/21(木) 18:43:32ID:???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 %]
0240235
2007/06/21(木) 18:59:48ID:???これから新たに書く場合は心掛けた方が良いけど
既に書き上げてしまったものの中で、自分でコードを全て把握しており
第三者に読ませることがないものについては放置でも良い
という方針でいこうと思います。
>>237
「そのCGIだけで完結していて、他のCGIから呼び出されない」という意味です。
>>238
ありがとうございます。
「とりあえずuse strict;は必須!」と書いてあるところは多いのですが
そのメリットやデメリットについてまで詳しく書かれているところは少なく
自分の理解が合っているのか不安だったので助かりました。
0241nobodyさん
2007/06/21(木) 19:05:29ID:???そんな制限はきいたこともないな。よくわからんがファイル開けて
ないんじゃねーの?
printやcloseのエラーまで厳密にチェックしろとまではいわないが、
openのエラーチェックだけは省略しないほうがいいよ。
0242nobodyさん
2007/06/21(木) 19:18:14ID:???ありがとうございます。
エラーチェックしてみたところ、openの段階でファイルが開けていませんでした。
しかしパスも間違えていないのに何故に開けないんだか。。
原因不明です(´・ω・`)
0244nobodyさん
2007/06/21(木) 19:52:32ID:???ちょこっと検証したけど挙動が変だわ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 に変更しても動く。最終改行の制御がどうしても一個多かった。
0245244
2007/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:???0247nobodyさん
2007/06/21(木) 20:24:59ID:???それはttが動く以前の話だろ。
use strict;
print <<"EOF";
@line
EOF
と同じこと。
0248nobodyさん
2007/06/21(木) 20:35:19ID:???わざわざ検証して下さってありがとうございます!
環境の違いがありますが試してみます!
大変参考になりました、感謝です!
0249nobodyさん
2007/06/21(木) 21:06:24ID:???> かといって my @line を普通に先に宣言しても上手く動かない。
ってこっちの例を出すべきでしたね。失礼。
0250244
2007/06/21(木) 22:19:28ID:???アホでした。245以降の私の戯言は消去してください。バルス!!
ああああああ、穴があったら入りたい。ったらありゃしない。
0251nobodyさん
2007/06/21(木) 23:04:05ID:???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
の様に改行されず出力されている様ですが、これは何故でしょうか?
0252251
2007/06/21(木) 23:24:48ID:???\nではなく\r\nとしたら、理想どおりの結果になりました。
スレ汚しすみませんでした…。
0253nobodyさん
2007/06/23(土) 11:05:34ID:???0254nobodyさん
2007/06/23(土) 16:43:39ID:???2: トイレに行って踏ん張ってみたが
3: うんこがでない
0255nobodyさん
2007/06/23(土) 20:09:32ID:???use strict;
my $a = 1;
print "$a\n";
これは正しいのに
# b.pl
my $a = 1;
1;
#a.pl
use strict;
require "b.pl";
print "$a\n";
これは正しくないのは何故ですか?
b.plで変数を宣言し、a.plでb.plをrequireしたら、b.plで宣言した変数が使えるのではないですか?
0256nobodyさん
2007/06/23(土) 20:13:58ID:???0257nobodyさん
2007/06/23(土) 23:12:26ID:???ちったぁ考えろヴァカが!!!!!
0258nobodyさん
2007/06/24(日) 00:04:21ID:???オマエモナー
以下無限ループ
0259nobodyさん
2007/06/24(日) 03:10:40ID:???> 最も外側のスコープであるファイルスコープで宣言されたのであれば、
> レキシカル変数はCのファイルにstaticなものと同じように振る舞います。
> 同じファイルの、宣言の後にある全ての関数から参照可能でありますが、
> そのファイルの外側から参照することはできません。これはモジュールの中で
> モジュールにプライベートな変数を作るために使われます。
0260nobodyさん
2007/06/24(日) 03:11:31ID:???いつからここは初心者罵倒スレにかわったの?
質問に答える気ないなら繰るなよ
0261nobodyさん
2007/06/24(日) 03:13:38ID:???眼科池よ
0262nobodyさん
2007/06/24(日) 03:23:31ID:???眼科池よ
0263nobodyさん
2007/06/24(日) 06:49:32ID:???なんか最近こういうの多くないか…意図的な偽者な気もするけど。
普通に別ファイルでmy付で宣言したら参照出来ないのは当たり前な気がするが
0264nobodyさん
2007/06/24(日) 08:29:54ID:???普通の変数で実行したら、きちんとエラーメッセージが出る
(compilation errors)し、そしたらここで質問せずに済む。
0265nobodyさん
2007/06/24(日) 16:08:49ID:???>>262だが、>>260の3行目は確かにおかしいが、それに対する>>261の
「回答してるからいいじゃん」的な発言もどうかと思うのでレスしただけ。
ここは初心者質問スレなわけで、当たり前の事でもわからない人が来る訳で。
それに対していちいち馬鹿だのなんだのと余計な一言つけないと回答できない
>>257 = >>261 = 263 は来なくていいと思う。
0266nobodyさん
2007/06/24(日) 16:35:34ID:???0268nobodyさん
2007/06/24(日) 17:18:27ID:???0269nobodyさん
2007/06/24(日) 18:02:44ID:???暴言が嫌ならmixiとかでやれよ。ここはそこまで平和な掲示板じゃないっての。
わたくすは普段は回答に罵倒なんか付けない善良な回答者ですが、何か。
0270nobodyさん
2007/06/24(日) 18:10:57ID:???馬鹿扱いされた質問者が
必死になってるとしか思えないww
0271nobodyさん
2007/06/24(日) 18:27:57ID:???0272nobodyさん
2007/06/24(日) 19:03:18ID:???自分の事を棚に上げる>>269の脳味噌はさぞ凄いんだろうな。
暴言が嫌とか、そもそも俺は質問者じゃないからどうでもいい。
ただ単に>>261が、>>260のレスに対してあほなレスして、
それに俺があほなレスを返したところで善良な(笑)>>263様が登場したわけさ。
>>270みたいな安直な考えしか浮かばないなら、勝手にそう思っとけ^^
■ このスレッドは過去ログ倉庫に格納されています