2010-08-02 4 views
0

Je veux générer quelques lignes de code Perl en utilisant le traitement des fichiers en Perl, par exemple:Pourquoi ai-je cette erreur de syntaxe dans mon programme de génération de code?

open(FILEHANDLE, ">ex.pl") or die "cannot open file for reading: $!"; 
print FILEHANDLE "use LWP::UserAgent;" 
.... 
.... some code is here 
.... 
print FILEHANDLE "my \$ua = new LWP::UserAgent(agent => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.5) Gecko/20060719 Firefox/1.5.0.5');" 

Mais quand je compile le code du générateur (non généré) Je reçois cette erreur:

syntax error at F:\test\sys.pl line 14, near "print" 
Execution of F:\test\sys.pl aborted due to compilation errors. 

Que vais-je faire?

+4

La première ligne est contradictoire: vous ouvrez pour l'écriture, mais le message d'erreur dit "lecture", ce qui est trompeur. – Svante

+0

@Svante: copier-coller .. la source de 54,8% de tous les bogues dans l'univers. – DVK

+0

Pourquoi écrivez-vous du code qui génère du code? C'est une chose inhabituelle à faire, en particulier dans un script de base. – Ether

Répondre

2

Vous avez raté la fermeture ' " ' (guillemets doubles) à la fin de la chaîne de la dernière impression (avant le point-virgule).

devrait être:

print FILEHANDLE "my \$ua = new LWP::UserAgent(agent => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.5) Gecko/20060719 Firefox/1.5.0.5')"; 

... Firefox/1.5.0.5')"; # To show end of that line without scrolling 

En outre, deux notes mineures:

  • S'il vous plaît envisager d'utiliser 3-argument form de open(), pas 2 argument; ainsi que les handles de fichiers lexicaux:

    ouvert (my $ fh, '>', "out.txt") ou de mourir "Erreur d'ouverture pour l'écriture: $!"; imprimer $ fh "stuff \ n";

  • Vous n'avez pas de close() à la fin du fichier - je suppose que vous avez donné un code incomplet.

+0

oui mais quand je mets "à la fin de la dernière impression je reçois à nouveau cette erreur Je l'édite – Eve

+0

@Jessica: L'avez-vous mis avant ':' comme dans l'exemple dans la réponse? – DVK

+0

@dvk: iam vraiment désolé – Eve

1

vous manque un point-virgule à la fin de cette ligne:

print FILEHANDLE "use LWP::UserAgent;" 
+0

version originale de la question avait le point-virgule mais pas la citation de fermeture ... celui là-bas en ce moment est un mis à jour – DVK

0

Voici comment vous écririez en Perl moderne:

use autodie qw(:all); 
{ 
    open my $handle, '>', 'ex.pl'; 
    print {$handle} <<'PERL_SOURCE'; 
use LWP::UserAgent; 
… 
# ↓ no variable quoting necessary thanks to here-document 
my $ua = LWP::UserAgent->new(agent => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.5) Gecko/20060719 Firefox/1.5.0.5'); 
… 
PERL_SOURCE 
} 

que l'éther a laissé entendre Dans les commentaires en haut, il n'est presque jamais nécessaire d'écrire du code généré dynamiquement dans un fichier. eval et Moose::Meta::* existent pour une raison.

Questions connexes