2010-02-13 11 views
3

J'essaie d'écrire dans le fichier ~/.log mais le fichier reste vide. Je ne sais pas pourquoi cela se passe, tout va bien.Pourquoi mon programme Perl ne génère rien dans mon fichier?

Mon système est Ubuntu 9.10amd64, Perl 5.10.

#!/usr/bin/perl 
# vim:set filetype=perl: 

use strict; 
use warnings; 

use LWP::Simple qw||; 
use Net::SMTP; 

# Only because log file 
$| = 1; 

my $match_string = "... some text to match ..." ; 
my $content; 

my @mails = ('[email protected]', 
     '[email protected]', 
     ); 
my $data = <<END; 

... Subject text ... 

END 

open(my $log, ">>","$ENV{HOME}/.log") 
or die "Couldn't open log file"; 

sub get($) { 
    my $content_ref = shift; 

    print {$log} "get: Error: $!\n" 
     until (${$content_ref} 
       = LWP::Simple::get("www.somesite.com/index.html")); 
} 


my $check_num = 0; 
get(\$content); 
while (index($content, $match_string) != -1) { 
    print {$log} "Check number $check_num\n" 
     or die "Couldn't write in log file"; 
# This is printed 
# print "Check number $check_num: $ENV{HOME}/.log\n"; 
    $check_num++; 
    get(\$content); 
    sleep 60*30; 
} 


my $server = "smtp.my_provider.org"; 
my $smtp = Net::SMTP->new($server) 
    or print {$log} "smtp: Couldn't connect on $server\n"; 

$smtp->mail('[email protected]_provider.org') 
    or print {$log} "smtp: Error in mail\n"; 
$smtp->bcc(@mails) 
    or print {$log} "smtp: Error in bcc\n"; 

$smtp->data(); 

$smtp->datasend($data) 
    or print {$log} "smtp: Error when sending data\n"; 
$smtp->dataend; 

$smtp->quit(); 

Répondre

6

Peut-être que vous n'êtes pas assez patient? Je vois que le script attend 3 minutes avant de sortir.

Notez que $| ne fonctionne que pour le actuellement sélectionné filehandle, ce qui signifie STDOUT ici.

Vous pouvez le configurer pour tout descripteur de fichier dans l'ancienne école, de façon complexe:

{ 
    my $old = select $log; 
    $| = 1; 
    select $old; 
} 

ou, si votre descripteur de fichier est descendant d'une classe particulière - et il est possible poignées autovivified appartiennent à cette classe - alors vous pouvez utiliser la méthode autoflush à la place, ce qui est beaucoup plus facile pour vous, mais fait la même chose sous le capot:

$log->autoflush(1); # untested 

espérons que ce dernier fonctionne. Voir IO::Handle et FileHandle pour autoflush - ils sont liés, mais je ne suis pas sûr qui s'applique ici.

+0

Je pense que vous voulez dire qu'il attend 30 minutes. 60 * 30. – Geo

+0

Merci :), c'est la solution – XoR

1

essayer de faire simple premier

open(my $log, ">>","~/.log") 
or die "Couldn't open log file"; 
print $log "smtp: Error in mail\n"; 
close $log 

ne cela fonctionne?

+0

oui, c'est le cas. C'était juste le problème avec le rinçage des tampons. Je n'ai pas sélectionné le handle de fichier avant de définir $ | variable. – XoR

2

Le code que vous présentez n'écrit dans les fichiers journaux que si quelque chose ne va pas ou si $ match_string est dans $ content. Se pourrait-il que tout fonctionne bien, mais il n'y a pas de correspondance, donc le fichier journal vide est exactement ce que vous attendez?

7

Vous devez déboguer chaque étape de votre script. Vous avez:

print {$log} "get: Error: $!\n" 
    until (${$content_ref} 
      = LWP::Simple::get("www.somesite.com/index.html")); 

Bien que vous avez probablement changé l'URL de votre question, écrit get est probablement de retour FNUD. Je ne suis pas sûr pourquoi vous utilisez until là. Voulez-vous l'exécuter pour toujours jusqu'à la mise en ligne d'un site? Vérifiez les valeurs de retour de tout pour voir ce qui se passe.

Je réduis la plupart de cette partie de votre script simplement:

while(1) { 
     my $data = LWP::Simple::get("http://www.somesite.com/index.html"); 
     print "got [$data]\n"; 

     if(substr(...) > -1) { sleep 1800; next } 

     .... do error stuff here ... 
     } 

Cependant, au lieu de dormir pendant 30 minutes, exécutez le script toutes les 30 minutes de Cron. De cette façon, vous vous débarrasser de la boucle:

my $data = LWP::Simple::get("http://www.somesite.com/index.html"); 
print "got [$data]\n"; 

exit if(substr(...) > -1); 

.... do error stuff here ... 
Questions connexes