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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2007/02/10(土) 19:21:23ID:???
Perlのコーディングで困ってる人のスレです。

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

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

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

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

前スレ http://pc10.2ch.net/test/read.cgi/php/1164519503/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0478nobodyさん2007/03/26(月) 08:04:04ID:???
そのマルチバイトってのは
Perlの内部的なワイド文字か
それともただのUTF-8の文字列かどっち?
0479nobodyさん2007/03/26(月) 09:18:04ID:???
/\P{IsASCII}/ とか?
0480nobodyさん2007/03/26(月) 12:48:08ID:???
ありがとうございます。

>>477さんので解決したっぽいです。ちなみにuse charnames ":full"しなくても
動きました。

>>476さん

違いをよくわかっていません。が、調べられそうなので調べてみます。
0481nobodyさん2007/03/26(月) 18:31:41ID:???
アンカがずれてるのは俺の環境が原因かと思って
ログを何度も読み込みしなおしてしまった
0482480=4772007/03/26(月) 22:30:29ID:???
>>478,>>479でした。失礼しました!
0483nobodyさん2007/03/27(火) 20:50:22ID:VNeopaMK
ニワンゴ(メールを送信するとそのメールに記された内容に基づいてスクリプトが実行され結果がメールで返ってくる)のような仕組みを自分で構築したいのですが、Perlでそれをやろうとしたら具体的にどんな処理が必要になるのでしょうか?
メールの解析は出来そうなんですが、いつ送信されるか分からないメールを待って、メールが来たらそれを受けて処理を始める仕組みをどう作れば良いのか分からないので教えて頂けませんか?
0484nobodyさん2007/03/27(火) 20:51:46ID:???
適当なSMTP鯖使えばええやん
0485nobodyさん2007/03/27(火) 21:07:13ID:WKbYIT6w
つうかニワンゴとPerlでググれば答えが出てる件
0486nobodyさん2007/03/28(水) 11:06:28ID:???
スレッド式の掲示板で同じIPアドレスからでも
スレッドごとに違うIDを表示したいのです。
どういう風にやったらよいのかよくわからないので
参考になるような例を教えて欲しいです。
0487nobodyさん2007/03/28(水) 11:08:23ID:???
ID生成にスレッド識別用のコードも利用すれば?
0488nobodyさん2007/03/28(水) 11:22:02ID:???
>>487
折角のレスありがとうございます。
それをPerlでやるとなると、どういう風な感じになるのでしょうか?
そもそも別のIPから同一のIDを出さない、しかしIDからIPがばれないようにする
という所で、もう行き詰まって、いっぱいいっぱいです。
0489nobodyさん2007/03/28(水) 11:47:27ID:???
ふつーcryptに突っ込んでるだけじゃない?
0490nobodyさん2007/03/28(水) 11:52:32ID:???
>>489
GNU拡張の$1$〜使うなら別だが素のcryptは先頭8文字しかみないので
場合によっては役に立たない。特にIPアドレスを文字列で食わせたり
したらアウトだね。

0491nobodyさん2007/03/28(水) 12:09:26ID:???
ハッシュ関数ぐらい自分で書け
0492nobodyさん2007/03/28(水) 12:18:19ID:???
>>490
そうです、単純にやったのでは文字数の問題があるのと
あと、IPアドレスって数字と区切りの点のみを暗号化するってことじゃないですか
やろうと思えば簡単にIDからIPアドレスの一部がわかっちゃうのではと
だから他の人はどうやってるのか、ちょっと具体例が知りたかったのです
0493nobodyさん2007/03/28(水) 12:20:41ID:???
自分用にパスワード自動生成スクリプト作っています。

配列 @character を次のように定義しました。
@character = ('a'..'z', 'A'..'Z','0'..'9');

しかし "l" (小文字のエル) や "1" (数字の一) 等の文字は紛らわしいので配列から排除したいです。

@character = ('a'..'k', 'm-z', 'A'..'Z','0'..'9'); みたいにやるとコードが汚くなるので、
一度配列を定義した後、特定の文字の要素を削除したいのですが、要素 'l' を削除するスマートな方法はないでしょうか?

初歩的な質問で申し訳ないですが、よろしくです。

0494nobodyさん2007/03/28(水) 12:41:03ID:???
Perl の勉強用に Windows 版 ActivePerl 5.8.8.820 をデフォルト設定でインスコしました。
.pl ファイルをダブルクリックすると実行されるんですが、終わった後に勝手にコマンドプロンプトが終了してしまいます。
ダブルクリックのみで実行して、終わったらそのままコマンドプロンプトを終了させない方法は無いでしょうか?
教えていただけたら嬉しいです。
0495nobodyさん2007/03/28(水) 12:48:08ID:???
@chars = ('a'..'z', 'A'..'Z', '0'..'9');
@omit = qw(1 l);

map { $idx{$_} = $i++ } @chars;
map { splice(@chars, $idx{$_}, 1); } sort { $idx{$b} <=> $idx{$a} } @omit;

print @chars,"¥n";
04964932007/03/28(水) 12:48:29ID:???
とりあえず、なんとか自力でできました。
「これは酷い」という部分があったら、教えてくれると助かります><

#!C:\Perl\bin\perl.exe

use strict;

# パスワードの文字数を聞く
print STDOUT 'パスワードの文字数を入力して下さい。';
my $passLength = <STDIN>;

# 使用許可文字と使用拒否文字の定義
my @allowChara = ('a'..'z', 'A'..'Z','0'..'9');
my @denyChara = ('b', 'i', 'l', 'q', 'D', 'I', 'O'. '0', '1', '9');
for my $allowCharaNo (@allowChara) {
  for my $denyCharaNo (@denyChara) {
    if ($allowChara[$allowCharaNo] eq $denyChara[$denyCharaNo]) {
      splice(@allowChara, $allowCharaNo, 1);
    }
  }
}

# ランダムなパスワードを生成・出力
srand;
my $password = '';
foreach (1..$passLength) {
  $password .= $allowChara[rand(@allowChara)];
}
print STDOUT $password;

exit;
04974932007/03/28(水) 12:49:25ID:???
>>495

す、凄い…。
>>496 のごちゃごちゃになっていた部分が凄いシンプルに!
登場した関数をぐぐって調べてみます。
ありがとうございます。
0498nobodyさん2007/03/28(水) 12:52:27ID:???
map BLOCK ARRAYは短く書くために使っているので、
for (ARRAY) BLOCK に置き換えると理解しやすいと思われ。
0499nobodyさん2007/03/28(水) 12:52:50ID:???
sleep
cmd /K perl
0500nobodyさん2007/03/28(水) 12:55:13ID:???
ん?いっぱいレスが挟まった。
>>499 は >>494 の回答。
0501nobodyさん2007/03/28(水) 13:03:46ID:???
>>493
@character = grep !/l|1/, ('a'..'z', 'A'..'Z','0'..'9');
05024942007/03/28(水) 13:04:35ID:???
>>499
thxです
前者は動かない…('A`)
------------------
print STDOUT 'aaa';
sleep;
------------------
だと何も表示されずに固まります。
理由は最後まで実行してからコマンドプロンプトに結果送っているからだと思われます。

後者は、バッチファイルやショートカットを作って、
"cmd /K perl ファイル名" を呼び出すってことですね。
こっちはできました。
05034932007/03/28(水) 13:06:31ID:???
>>501
シンプルすぎて感動で涙が出ました…。
(l または 1) にマッチするもの以外を配列に突っ込む、日本語で書くことをそのままPerlにしたといった感じですね。
05044952007/03/28(水) 13:06:40ID:???
>>501
ぽむ☆

なにをややこしく考えていたのだろうorz
0505nobodyさん2007/03/28(水) 13:09:01ID:???
>>493 逆にしてもいい
@character = grep 'bilqDIO019' !~/$_/, ('a'..'z', 'A'..'Z', '0'..'9');
0506nobodyさん2007/03/28(水) 13:20:15ID:???
>>505
なるほどね
右の内容が順番に評価されて $_ には各項目が入る
パターンマッチ演算子を使ってその文字列の中にアルファベットがあるか調べる
単純かつ美しい流れ

しかしこんなくだらん命題でいろいろな答えがでるとはおもわんかった
0507nobodyさん2007/03/28(水) 13:25:54ID:???
TIMTOWTDI
0508nobodyさん2007/03/28(水) 17:03:34ID:sUHWjomT
ソケットで獲得したページからリンクタグを抽出して表示させたいんですがうまくいきません

while(<SOCK>){
while(s/\n|\r\n|\r//is){}
if($_ =~ /(<a href="(http:[\w\.\~\_\-\/\?\&\+\=\:\%]+)")/is){
push @img, "$2\n";
}
}

なんか獲得できるのとできないのがあるみたいで・・・
$_に複数個あるときも1つしか抽出できませんでした
0509nobodyさん2007/03/28(水) 17:10:42ID:???
>>508
そういうときはソケットから読んだ文字列がどうなってるか確かめて、

1)ソケットから読んだ文字列がおかしい
2)ある文字列のときにif以後がうまく働かない

のどちらであるか切り分けしてから質問するものだ。
0510nobodyさん2007/03/28(水) 22:46:18ID:???
>>508
while(s/\n|\r\n|\r//is){}
はおかしすぎる

if($_ =~ /(<a href="(http:[\w\.\~\_\-\/\?\&\+\=\:\%]+)")/is) は、
「$_ が /(<a href="(http:[\w\.\~\_\-\/\?\&\+\=\:\%]+)")/is」にマッチしたら
なので、最初の一個がマッチした時点でpushし、次のループに移行する
つまり$_にいくつaタグがあろうと、最初の一個しか抽出できない

書くならこんな感じか?

$_ = do {local $/; <SOCK>};
my @img = map {"$_\n"} (/<a href="(http://.*?)"/gis);

あと、aタグの記法がこれで固定されているって判っているなら構わないけど
hrefの前に別の属性が記述されている場合とか
「"」じゃなくて「'」で括られていたりコーテーションがついていなかったり
する場合も考慮するのが普通かと
05115102007/03/28(水) 22:51:27ID:???
あ
my @img = map {"$_\n"} (/<a href="(http://.*?)"/gis);
は
my @img = map {"$_\n"} (/<a href="(http:\/\/.*?)"/gis);
に訂正
偉そうに書いておいてエスケープ忘れた…
0512nobodyさん2007/03/29(木) 00:42:31ID:???
>>509
今後の参考にさせていただきます^^;

>>510
>最初の一個しか抽出できない
あ〜・・・だから抽出したリンク数が合わなかったんですね^^;
ありがとうございます。

これからmap関数?を調べて(初めて見るんで;)それから試してみようと思います
0513nobodyさん2007/03/29(木) 12:49:04ID:???
スレッドごとに違うIDを表示したいという件で質問した者ですが、自己解決しました。
回答はもう結構です。お騒がせしました。
0514nobodyさん2007/03/30(金) 04:04:21ID:???
WinXP 上の ActivePerl で、再帰的にファイル名を収集しています。

「表」というディレクトリに chdir して、
その中で opendir, readdir とかしたいのですが、うまくいきません。

うまくいく方法があればお願いします。
0515nobodyさん2007/03/30(金) 06:41:02ID:???
なんかその質問ム板で見た記憶がある
答えは忘れたけどw
0516nobodyさん2007/03/30(金) 07:44:15ID:???
File::FindとかFile::Find::IteratorとかIO::AllとかPath::Classとか
0517nobodyさん2007/03/30(金) 07:44:58ID:???
File::Finder忘れてた
0518nobodyさん2007/03/30(金) 11:12:45ID:Ov/YkxL/
sub loadFormdate
{
my($query,$pair);
if($ENV{'REQUEST_METHOD'} eq 'POST'){
read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
}
else{
$query = $ENV{'QUERY_STRING'};
}
foreach $pair(split(/&/,$query)){
my ($key,$value) = split(/=/,$pair);

$value =~ tr/+/ ;
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg;
$FORM{$key} = $value;
}
}


というプログラムでhttp://www.e777.co.jp/perlcw/perlcw.htmlのサイトを使って文法チェックしたところ

Bareword found where operator expected at tmp.pl line 75, near "9a"
(Might be a runaway multi-line // string starting on line 74)
(Missing operator before a?)
Unquoted string "a" may clash with future reserved word at tmp.pl line 75.
syntax error at tmp.pl line 75, near "9a"
Unrecognized file test: -F at tmp.pl line 75.

が出てきました
正しいプログラムをコピペしても出てきたんですが
どこが違うか教えていただけないでしょうか??
0519nobodyさん2007/03/30(金) 11:53:25ID:???
$value =~ tr/+/ /;
スラッシュがぬけてる。
0520nobodyさん2007/03/30(金) 12:14:19ID:???
> File::FindとかFile::Find::IteratorとかIO::AllとかPath::Classとか

File::Find と Path::Class はうまく扱えませんね。
0521nobodyさん2007/03/30(金) 12:17:30ID:???
> なんかその質問ム板で見た記憶がある
> 答えは忘れたけどw

Perlについての質問箱 30箱目
http://pc11.2ch.net/test/read.cgi/tech/1173880452/10

これもうまく動かない。
0522nobodyさん2007/03/30(金) 20:49:19ID:???
>518みてて思ったんだけど、

s/%([\da-f]{2})/chr hex $1/ieg;

s/%([\da-f]{2})/pack 'H2', $1/ieg;

どっちがはやいんだろ。
0523nobodyさん2007/03/30(金) 21:28:36ID:???
use strict;
use Benchmark qw( timethese cmpthese ) ;
use CGI::Util qw(escape);
my $str = escape("Perlコーディング初心者質問スレ");
my $r = timethese( 100000, {
chrhexi => sub {
local $_ = $str;
s/%([\da-f]{2})/chr(hex($1))/ieg;
},
chrhex => sub {
local $_ = $str;
s/%([0-9A-Fa-f][0-9A-Fa-f])/chr(hex($1))/eg;
},
packh2i => sub {
local $_ = $str;
s/%([\da-f]{2})/pack('H2', $1)/ieg;
},
packh2 => sub {
local $_ = $str;
s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
},
} );
cmpthese($r);
0524nobodyさん2007/03/30(金) 21:29:20ID:???
Benchmark: timing 100000 iterations of chrhex, chrhexi, packh2, packh2i...
chrhex: 8 wallclock secs ( 5.21 usr + 2.13 sys = 7.34 CPU) @ 13623.98/s (n=100000)
chrhexi: 7 wallclock secs ( 6.72 usr + 0.71 sys = 7.43 CPU) @ 13458.95/s (n=100000)
packh2: 8 wallclock secs ( 7.25 usr + 0.57 sys = 7.82 CPU) @ 12787.72/s (n=100000)
packh2i: 8 wallclock secs ( 7.54 usr + 0.61 sys = 8.15 CPU) @ 12269.94/s (n=100000)
Rate packh2i packh2 chrhexi chrhex
packh2i 12270/s -- -4% -9% -10%
packh2 12788/s 4% -- -5% -6%
chrhexi 13459/s 10% 5% -- -1%
chrhex 13624/s 11% 7% 1% --

perl -v
This is perl, v5.8.8 built for i386-linux-thread-multi
uname -a
Linux colinux.localdomain 2.6.11-co-0.6.4 #1 Mon Jun 19 05:36:13 UTC 2006 i686 i686 i386 GNU/Linux
05255182007/03/31(土) 06:34:34ID:x8D9Mjhz
>>519さん
あっ本当ですね
でも文法でひっかかるのはその下の
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg;という部分なんです
05265182007/03/31(土) 07:58:19ID:x8D9Mjhz
>>519さんの言うとおりにしたら出来ました
エラーってでるとこが悪いとは限らないんですね
ありがとうございました
0527nobodyさん2007/03/31(土) 11:00:31ID:???
だから、/を補えば出なくなるが?
/がないから、s/の/までがtrだと思われてるわけだろ?
0528nobodyさん2007/03/31(土) 11:01:12ID:???
スマン、526が目に入ってなかった。
0529nobodyさん2007/04/01(日) 07:53:31ID:uYKSgLT/

�T if(not exists $FORM{'adminpass'}) {
printGatePage();
  }
�U  elsif($FORM{'adminpass'} eq $ADMINPASS) {
loadUserfile();

   }
   else {
printErrorPage("管理パスワードが違います。");
   }
   exit;
というプログラムでif文とelsif文について教えてください
�Tが真 つまり$FORM{'adminpass'}がなかった場合
�Tのプログラムが実行されて�Uのelsifのプログラムは実行されないはずなんですが
本によれば�Uのプログラムも実行されるんです
どういうことかと言いますと
�Tで真
→$FORM{'adminpass'}がないのでprintGatePage();で$FORM{'adminpass'}を存在させるようにする
→�Uのプログラムが実行
となっています
これは本当は�Tが真であれば�Uのプログラムは実行されず終わるんではないでしょうか?
よろしくおねがいします


0530nobodyさん2007/04/01(日) 08:34:15ID:???
自分で確かめてみればいいじゃん
0531nobodyさん2007/04/01(日) 08:43:42ID:???
>>529
# ローマ数字(I、II、III、…)は機種依存なので使うのをやめましょう
# 本によれば、というからには、本のタイトルや出版社など原典がわかるようにしましょう

%FORMについてなにも説明がありませんが、はフォームデータを解析・デコードして入って
いるのだと思います。で、Iが真ならばIIは評価されないというのはその通りです。

なお、「$FORM{'adminpass'}がなかった場合」というのは、%FORMに adminpassという
キーが存在しなかった場合、という意味です。普通パスワードの入力欄は、inputタグを
使うのであり、空欄のままsubmitを押しても、"adminpass="という文字列が送られて
きますので、それを%FORMに格納した場合、 adminpassというキーは存在しているので、
Iは常に偽となります。パスワードが空欄かどうかを判定するには、existsではなく
空文字列との比較($FORM{adminpass} eq "")をする必要があります。
05325292007/04/01(日) 09:36:29ID:uYKSgLT/
>>530さん
自分で確かめたらelsifが実行されていたのでここで聞いています
>>531さん
詳しい説明ありがとうございます
ではなぜelsifのプログラムが実行されたのでしょうか??
プログラム全部を載せたいのですが改行で無理みたいなので…

sub printGatePage
{
print <<END;
Content-type: text/html; charset=$CHARSET

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head><title>ゆーざーかんり</title></head>
<body>
<h1>ユーザー管理</h1>
<form action="$ENV{'SCRIPT_NAME'}" method="POST">
管理パスワード:<input type="password" name="adminpass"><br>
<input type="submit" value="決定">
</form>
</body>
</html>
END
}

本の名前は『10日でおぼえる Perl/CGI』著:高橋大吾です
この本の6章で認証プログラムを作っているのですが
0533nobodyさん2007/04/01(日) 10:44:05ID:????PLT(12980)
そんな本捨ててしまいなさい
0534nobodyさん2007/04/01(日) 13:23:47ID:???
>>532
・I → printGatePage() → II → loadUserfile()
という流れだと思い込んでるから、自分で確かめても if と elsif を両方通ってると思うだけで。

・何かのフォームからPOST → Iが真 → printGatePage() → exit  # >>532のHTMLを吐いて一旦終了
・続いて「ゆーざーかんり」ページからPOST → 同じスクリプトが叩かれる → Iが偽 → II
…こう動いてるような気はしませんか。
05355292007/04/01(日) 15:33:33ID:uYKSgLT/
>>533さん
本当に捨ててやりたいです
でも独学なのでこの本が一番分かりやすかったんで…

>>534さん
つまり
<form action="$ENV{'SCRIPT_NAME'}" method="POST">
でもう一度同じとこに戻っていることですよね??
ありがとうございました 大変助かりました
0536nobodyさん2007/04/03(火) 16:20:52ID:7w7pj3iq
普通に動くが・・・

use CGI;
foreach (&CGI::param) {
$FORM{$_} = &CGI::param($_) || undef; }

print &CGI::header(-charset=>'Shift_JIS'),
&CGI::start_html(-encoding => 'Shift_JIS');

if(not exists $FORM{'adminpass'}) {
&printGatePage; }
elsif($FORM{'adminpass'} eq 'aaaa') {
&loadUserfile; }
else {
&printErrorPage; }

sub printGatePage {
print <<END;
<h1>ユーザー管理</h1>
<form action="$ENV{'SCRIPT_NAME'}" method="POST">
管理パスワード:<input type="password" name="adminpass"><br>
<input type="submit" value="決定"></form></body></html>
END
exit(0); }
sub loadUserfile {
print 'loadUserfile</body></html>'; exit(0); }
sub printErrorPage {
print 'printErrorPage</body></html>'; exit(0); }
0537nobodyさん2007/04/03(火) 20:04:01ID:Ex+wZs3r
【リダイレクトについて】
LocationヘッダをContent-type:text/htmlを出力した後に
使いたいのですが何か方法はないでしょうか。
0538nobodyさん2007/04/03(火) 20:51:15ID:???
>>537
<q cite="http://www.studyinghttp.net/cgi-bin/rfc.cgi?3875#Sec6.2.2";>
スクリプトはいかなる他のヘッダフィールドも message-body も
返してはならない
</q>
0539nobodyさん2007/04/03(火) 20:52:16ID:???
http://homepage2.nifty.com/~~~/utf8_decode.pll

これなんですが、標準入力をリダイレクションでファイルに変更すると
標準出力されません、なぜでしょうか?
05405392007/04/03(火) 20:53:22ID:???
環境はXPproSP2,ActivePerl-5.8.8.820です。
05415392007/04/03(火) 20:54:01ID:???
失礼しました。下記が正しいです。

http://homepage2.nifty.com/~~~/utf8_decode.pl
0542nobodyさん2007/04/03(火) 21:07:53ID:???
どこでヘッダ吐いてんのさ
05435392007/04/03(火) 21:12:28ID:???
>>542
私への質問でしょうか?
すみません、意味がわかりません。
申し訳ありません。
0544nobodyさん2007/04/03(火) 21:22:35ID:???
CLIだしム板に振ろうかと思ったら、向こうからこっちに来たのか。

Perlについての質問箱 30箱目
http://pc11.2ch.net/test/read.cgi/tech/1173880452/163-178
05455372007/04/03(火) 21:22:59ID:???
>>538
つまりはできないということなのでしょうか?
もしできないのであればCGIにてhtmlを出力した後に
別ページを表示することはMETAタグを使わずには打
開策すらないのでしょうか…。
05465392007/04/03(火) 21:27:10ID:???
>>544
そうです。お願いします
0547nobodyさん2007/04/03(火) 21:49:45ID:???
>>547
はいできません。CGIやHTTPのしくみをよく勉強しましょう。
05485372007/04/03(火) 22:09:15ID:???
>>547
勉強になりました。ありがとうございます。
0549nobodyさん2007/04/04(水) 09:32:06ID:???
もしかしたらどっかのブラウザのバグでできるかもよ、うまくやればドメインを偽って…
0550nobodyさん2007/04/04(水) 14:01:56ID:???
Content-Typeの前にLocationを置くなら>538のすぐ後にある
6.2.4. Client Redirect Response with Document
にできるのかな。
05515392007/04/04(水) 20:34:07ID:???
自己解決しましたよ。

D:\htdocs\awstats\utf8_decode.pl < T:\Logs\a.txt
ではダメで、
perl D:\htdocs\awstats\utf8_decode.pl < T:\Logs\a.txt
ではOKです。
先頭のperlを書きたくなければ、下記らしいです。

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion
\Policies\Explorer
にInheritConsoleHandlesというDWord値を作り1をセット
0552nobodyさん2007/04/04(水) 21:42:58ID:???
とりあえずだ、Perlと関係ないことに気がつこうな
0553nobodyさん2007/04/04(水) 23:16:32ID:???
Perlに関係あるじゃん
とりあえず、正常動作おめ
0554nobodyさん2007/04/05(木) 00:54:13ID:???
OSおよびコマンドラインの話題だなどう考えても
0555nobodyさん2007/04/05(木) 05:46:52ID:???
>>553 = >>539 だなどう考えても
0556nobodyさん2007/04/05(木) 11:31:17ID:???
posfix(v2.2)のperlでの使い方について質問させてください。
配送エラーのとき、$from_mailに返信させたいのですができません。

$from_mail="[email protected]"; # $from_mailは存在します。
$to_mail="[email protected]"; # $to_mailは存在しません。(hoge2.jpは存在しないものとします。)

open (MAIL,"| $mail_pass -t") || &error("posfixエラー");
# print MAIL "Error-To: $from_mail\n"; # Error-To:ヘッダがあっても無くても返ってきません
print MAIL "From: $from_mail\n";
print MAIL "To: $to_mail \n";


これを実行したところ、エラーの連絡が$from_mailに送信されません。

上記と同じメールの内容で、outlookを使用して、手作業で送信すると
件名:failure notice のエラーのメールが、返ってきました。

・posfixの設定で、足りないものあるのでしょうか?
・perlのプログラミングで、足らないことがあるのでしょうか?

よろしくお願いします。
0557nobodyさん2007/04/05(木) 11:42:22ID:???
本当にこうソースに書いているのなら、

> $from_mail="[email protected]"; # $from_mailは存在します。
> $to_mail="[email protected]"; # $to_mailは存在しません。(hoge2.jpは存在しないものとします。)

メール送信以前の問題なので$from_mail,$to_mailの値をチェックすることを
お勧めします。

ヒント: 文字列リテラルへの(配列)変数の埋め込み
0558nobodyさん2007/04/05(木) 11:43:28ID:???
$from_mailも$to_mailも@hogeが変数展開されてる。

シングルクォートで

$from_mail = '[email protected]';
$to_mail = '[email protected]';

としてやればおk

# hoge.jpは実在するドメインだから、こういうときの例にはexample.comを使おうな
0559nobodyさん2007/04/05(木) 12:29:53ID:???
>>557
>>558
お返事ありがとうございます。
シングルクォートに変更し、存在するメールには、
送信できること確認できました。

[cgi]
$from_mail = '[email protected]';
にしてみましたが、配信エラーの通知がされませんでした。
また、ドメイン検索で存在しないことを確認したドメインを
指定してもだめでした。

[outlook]
手作業で送信したとき、配信エラーが返って来るか確認してみました。
存在しないことを確認したドメインで、outlookでyahooや他のメールサーバから
送信すると戻ってきましたが、'[email protected]'は、戻ってきませんでした。

[考察]
ドメイン検索で存在しないことを確認したドメインで
outlookから送信すると、普通にエラーが帰ってきました。
cgiだと帰ってきません。cgiでなにかおかしいんじゃないかと思ってます。

open (MAIL,"| $mail_pass -t")の-tオプションが無いと
メール送信できなかったので付けてます。

思い当たることなどありますでしょうか。
よろしくお願いします。
0560nobodyさん2007/04/05(木) 13:09:03ID:???
エラーメールのあて先はenvelope fromで決まるが、それはヘッダのfromとは
まったく無関係で、送信プログラムにsendmail(postfixのsendmail互換コマンド)
を使っているならばプログラムを実行したユーザのアドレスになるのがデフォルトで、
変更したい場合は-fオプションで指定する必要がある。

open (MAIL,"| $mail_pass -t -f $from_mail")

0561nobodyさん2007/04/05(木) 16:00:15ID:???
>>560
丁寧な解説ありがとうございます。
open (MAIL,"| $mail_pass -t -f $from_mail")
にしてみましたが、配送エラーのメール送信されませんでした。

Envelope-From:ヘッダー、を試しましたがエラーは返信されませんでした。

cgiじゃなくて、postfixの設定ファイル/etc/postfix/main.cf
の設定がおかしい可能性高いでしょうか?

/etc/aliasesの設定がおかしいのかと思いまして、
FROM:ヘッダーを除いて、存在するメールを指定すると、
送信者はApache表示で$from_mailは、きちんと指定されていました。

$from_mailは、レンタルサーバのメールアドレスですが、
postfixサーバから普通に送信できるので、大丈夫だと思うのですが。

ん〜。難しいです。
0562nobodyさん2007/04/05(木) 16:40:06ID:???
>>561
postfixのログを見られるなら見るのが一番だが、レン鯖などで
見られないなら、まず自分に送ってみて届いたメールが思い通りに
なっているか確認するのが基本だな。

envelope fromはたいていreturn-pathというヘッダに保存されるので
それが自分が設定したつもりのものか確認するといい。
0563nobodyさん2007/04/05(木) 16:56:54ID:???
>>562
自宅サーバで、勉強してます。
違うcgiの過去の受信メール見てみるとReturn-Path:があるときと、
無いときがありました。ということは、cgiがおかしいのかもです。

どうもありがとうございました。
原因がわかりましたら、報告いたします。
0564nobodyさん2007/04/05(木) 18:06:22ID:2CVq1dn3
質問です。当方の掲示板にて半角を使いたいとの要望がありました。

で、ググった結果jcodeg.plを知り、これをアップロードして、半角文字のみで
書き込みのテストをしたらちゃんと半角で表示されました。

とここまでは良かったのですが、文章に全角と半角文字を混ぜた状態で
投稿すると、投稿後の記事内の文章が全て全角で表示されてしまいます。

入力した通りに投稿するには、jcodeg.plのドコを変更したらよいのでしょうか?
0565nobodyさん2007/04/05(木) 18:58:00ID:???
Encode.pmにしてutf8で書く
0566nobodyさん2007/04/05(木) 18:59:13ID:???
改造スレ行った方がいいんじゃね
0567nobodyさん2007/04/05(木) 19:04:47ID:???
>>563
今までのレスを斜め読みしただけで見当ハズレかも試練が
OP25ってオチかな?
0568nobodyさん2007/04/06(金) 07:42:58ID:???
>>567
port25は開けていました。

試しにコマンドラインで、[email protected]に送信してみました。
--------------------------
# /usr/sbin/sendmail -t
Envelope-From:"普段のメール"
To:[email protected]
.
--------------------------
で送信しましたが、配送エラーのメール返って来ませんでした。
・コマンドのオプション
・Envelope-From:"普段のメール"で、何かあるのか。
 いろんなメール指定してみましたがダメでした。
・ヘッダーオプションで他に何か必要か
ぐらいと思うのですが、どのあたりがおかしいでしょうか。

これが解決したら、perlにそのまま反映すれば
配送エラー返ってくる気がするんですが。。。
よろしくお願いします。
0569nobodyさん2007/04/06(金) 09:53:13ID:???
>>567
Envelope-From: などというヘッダはない。

# /usr/sbin/sendmail -t [email protected]
To: [email protected]

本文…
.
#

のように指定します。-fの直後に指定するのがenvelopeアドレスです。
上記の場合、envelopeアドレスに何かメールを戻したいなら、Toヘッダのアドレスを
実際に存在しないアドレスとか、ドメインにしてみないと、Toのアドレスに普通にメールが
届いて終わるので注意。

さもなくば、telnet localhost 25 でMTAと直接交信してみるとか。
0570nobodyさん2007/04/06(金) 12:41:32ID:???
>>569
お返事ありがとうございます。
#/usr/sbin/sendmail -t -f<存在するメール>
To:[email protected]
エラーメール戻ってきませんでした。
メールが送信できたのか、送信できていないのかも区別が付きません。orz
DNSの設定かと思い検索してます。
スレ違いになってきてしまいまい、申し訳ないです。

maillogは、下記の通りです。
Apr 6 12:26:04 localhost postfix/pickup[20462]: 4CCACC04193: uid=48 from=<存在するメール>
Apr 6 12:26:04 localhost postfix/cleanup[20527]: 4CCACC04193: message-id=<・・・@mail.example.com>
Apr 6 12:26:04 localhost postfix/qmgr[17310]: 4CCACC04193: from=<存在するメール>, size=301, nrcpt=1 (queue active)
Apr 6 12:26:04 localhost postfix/qmgr[17310]: 4CCACC04193: to=<[email protected]>, relay=none, delay=0,
status=deferred (delivery temporarily suspended: Host or domain name not found. Name service error for name=example.jp type=MX:
Host not found, try again)
05715702007/04/06(金) 19:26:09ID:???
あまりにもスレ違いなので、linuxスレに行かせていただきたいと思います。
経過ですが、存在しないメールアドレスに送信した場合、
delivery temporarily suspended: Host or domain name not found.
Name service error for name=example.jp type=MX: Host not found, try again)
このパターンになるようです。
やっぱり、エラーのメールが自分に帰ってこないと不便ですよね。

tailf maillogで、眺めていたら突然、上記のパターンでログが大量に流れました。
昔送信したでたらめなメールで、しかも、try againっていうぐらいなので、
送信されずに、再送待ちになってるみたいです。
ttp://www.postfix-jp.info/trans-2.0/jhtml/faq.html

あとは、再送待ちじゃなくて、配送エラーが送信すればいいんですね。
再送のメールはどこにあるのとか、いろいろ、つまずいてます。
あとちょっとのような気がしてきました。

丁寧にレスありがとうございました。
05725702007/04/07(土) 04:16:46ID:???
maximal_queue_lifetime=0
で解決しました。

ログを見ることと、検索能力が少しアップしました。
ありがとうございました。
0573nobodyさん2007/04/07(土) 18:44:41ID:MSfJ44Rv
Perlプログラム内でグローバルIPを取得するにはどんなコマンドを使用すれば
よいですか?
Linuxです。
0574nobodyさん2007/04/07(土) 18:50:58ID:???
外部の鯖にIPだけを表示するSSI
とか置いてそこからlwpなりで適当に
取ってくればいいんじゃないすか
05755732007/04/07(土) 19:10:45ID:MSfJ44Rv
>>574
PerlでグローバルIPを取得する関数がないとすると、
シェルで組んだ方がよさそうですね。。

ありがとうございました
0576nobodyさん2007/04/07(土) 19:31:41ID:???
診断君を利用するんだ
とか勝手なこと言ってみる
0577nobodyさん2007/04/07(土) 19:56:03ID:???
「持っている全部のIPアドレスからプライベート領域に該当するものや
127.0.0.1みたいなのを取り除いて残ったもの」とすればよさそうだが、
これを複数もつホストもあるだろうなぁ。

■ このスレッドは過去ログ倉庫に格納されています