2017-09-27 4 views
0

J'ai le morceau de code suivant dans un grand expéditeur Perl CGI.Le courrier d'impression Perl CGI n'imprime pas la boucle foreach

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

Le réseau de son tirant est @more = qw (google.com bob.com frank.com);

Lorsque j'exécute le script sendmail cgi et que je reçois le courrier électronique. Cette ligne est omise! ce qui donne? pourquoi n'ai-je pas de résultats? Comment puis-je le réparer?

Merci à l'avance

+1

Le fait que ce CGI est un faux complet ici. L'une des compétences les plus utiles qu'un programmeur peut avoir est la possibilité de tester des scénarios qui éliminent les facteurs qui n'ont aucun effet sur le problème en cours. –

Répondre

2

Vous avez:

print MAIL do { expression } 

... où l'expression ne renvoie pas quelque chose d'utile pour do d'imprimer sur la poignée de fichier courrier.


Vous avez aussi:

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

... où vous n'êtes pas imprimer à la poignée de fichier courrier.


se débarrasser des do parce qu'il est un non-sens. Imprimez l'URL à l'endroit où vous voulez l'imprimer.

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

Pensez également à utiliser un sensible module for sending email (probablement Email::Sender::Simple au lieu de (probablement) des choses de la tuyauterie dans le sendmail directement sur votre système

+0

Humm. L'ajout de foreach dans le mail d'impression génère une erreur car il ne l'aime pas. Print MAIL "URL: $ url \ n"; pour chaque $ m (@more) {print MAIL "URL: $ m \ n";}}; imprimer MAIL "Échéance: $ date \ n"; – user1937895

+0

@ user1937895 - Je n'ai pas dit que vous devriez le mettre dans l'impression. Remplacez ** tout ** du code dans la question par le code dans le troisième bloc de code de cette réponse. – Quentin

+0

pourriez-vous poster un exemple de ce que vous voulez dire? Ce n'est pas clair. Merci – user1937895

2

Votre ligne.

print"URL: $m\n" 

est l'impression l'URL à STDOUT, pas au handle de fichier MAIL et l'incorporation de cette ligne dans un foreach dans un do ne va pas changer cela du tout. Tout ce qui est imprimé dans le handle de fichier MAIL est la valeur de retour de la boucle foreach. Et cela (comme vous l'avez vu) ne retourne rien.

Je pense que vous voulez remplacer tout ce code avec:

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

Ou

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

Cela a fonctionné !!+1 – user1937895

+0

@ user1937895: Ce n'est vraiment pas différent de la réponse de Quentin. Cela fonctionnerait aussi si vous l'avez tapé correctement. –

+1

@ user1937895: Aussi, j'espère que vous prenez le temps de comprendre pourquoi ces solutions fonctionnent et votre code original n'a pas fonctionné. Il suffit de copier et coller du code depuis Stack Overflow pour créer une carrière en tant que programmeur. –