2017-09-27 18 views
0

大きなCGI perlメーラーに次のコードがあります。CGI Perl印刷メールforeachループが印刷されない

 print MAIL do{foreach my $m (@more){ print"URL: $m\n";}}; 

それから引き上げアレイ @more = QW(google.com bob.com frank.com)です。

sendmailのcgiスクリプトを実行してメールを受け取るとき。この行は省略されています!何を与える?なぜ結果が得られないのですか?どうすれば修正できますか?アドバンス

おかげ

+1

これはCGIであるという事実は、ここで完全に赤いニシンです。プログラマが持つ最も有用なスキルの1つは、問題に影響を与えない要因を取り除くシナリオをテストする能力です。 –

答えて

2

あなたは持っている:式がMAILファイルハンドルに印刷するdoするための有用なものを返さない

print MAIL do { expression } 

を...。


はまた持っている:あなたはMAILファイルハンドルに印刷されていない

foreach my $m (@more){ 
    print "URL: $m\n"; 
} 

を...。


ナンセンスだからdoを取り除く。 URLを印刷する場所に印刷します。

foreach my $m (@more){ 
    print MAIL "URL: $m\n"; 
} 

また直接あなたのシステム上のsendmailバイナリにsensible module for sending emailおそらく(おそらくEmail::Sender::Simpleの代わりに、()配管のものを使用して

+0

ハム。印刷メール内にforeachを追加すると、それが嫌いなのでエラーが発生します.print MAIL "URL:$ url \ n"; foreach my $ m(@more){print MAIL "URL:$ m \ n";}}; 印刷メール "Due Date:$ date \ n"; – user1937895

+0

@ user1937895 - 私はあなたがそれを印刷物の中に置くべきではないと言いました。問題のコードの**すべて**をこの答えの3番目のコードブロックのコードに置き換えます。 – Quentin

+0

あなたは何を意味するのかの例を投稿できますか?それははっきりしていません。ありがとう – user1937895

2

あなたのラインを考えてみます。

print"URL: $m\n" 

は、印刷ですURLはSTDOUTで、MAILファイルハンドルではなく、その行をに埋め込むdo内のはそれをまったく変更しません。 MAILファイルハンドルに出力されるのは、foreachループの戻り値だけです。そして、あなたが見たように、それは何も返されません。

私はあなたがこのコードのすべてを交換したいと思う:

print MAIL "URL: $_\n" for @more; 

それとも

print MAIL map { "URL: $_\n" } @more; 
+0

それはうまくいった!+1 – user1937895

+0

@ user1937895:これはQuentinの答えとまったく同じです。あなたが正しくタイプした場合、それはうまくいくでしょう。 –

+1

@ user1937895:また、これらのソリューションがなぜ機能し、元のコードがなぜ機能しなかったのか理解する時間を取っていただければ幸いです。 Stack Overflowのコードをカット&ペーストするだけでプログラマーとしてのキャリアを構築することはできません。 –