2009-08-04 4 views
1

Pourquoi cela ne fonctionne-t-il pas?En Perl, pourquoi une erreur de syntaxe se produit-elle lorsque j'essaie d'utiliser string eval?

eval "$response = $ua->request($r);" 
print "[email protected]"; 

donne:

syntax error at (eval 8) line 1, near "=" 
+1

Etes-vous sûr que vous avez vraiment besoin de travailler avec eval ici? – innaM

+0

@Manni; probablement pas - c'est probablement un exercice d'apprentissage. –

+2

D'une manière ou d'une autre, c'est certainement un exercice d'apprentissage. Mais il est important de ne pas apprendre les mauvaises choses. – innaM

Répondre

15

Il ne fonctionne pas parce que votre chaîne double cité est soumise à l'interpolation, ce qui ne va pas aller bien, avec ces variables étant développées en place. Et vous avez besoin d'un point-virgule en dehors de votre eval, pas tellement à l'intérieur. Essayez les guillemets simples comme suit:

eval '$response = $ua->request($r)'; 
+3

Pourquoi pas des accolades? – innaM

+2

Bien qu'il ait été répondu, il est important de noter, comme l'intervenant précédent a fait allusion, que les évidences filiformes qui pourraient autrement être accomplies par des évaluations de blocs, mentionnées ci-dessous, sont suspectes. Veuillez modifier votre réponse de peur que nous commencions à préconiser l'utilisation d'évidences filiformes. –

+2

Je ne pense pas que je devrais modifier ma réponse, car Brad Gilbert a une alternative parfaitement bonne, mais je tiens à dire que je ne préconise pas les évidences filiformes; J'essayais juste de corriger les déficiences immédiates et syntaxiques du code d'OP, où M. Gilbert aborde les lacunes tactiques. – chaos

22

Une meilleure question est pourquoi vous utilisez une chaîne eval, au lieu d'un bloc eval?

eval { $response = $ua->request($r); } 
print "[email protected]"; 
+2

Mieux encore, attrapez l'exeption avec une construction "eval ou do": eval {blah; 1} ou do {avertir "Eval failed: $ @"}; – daotoad

2

Une question encore meilleure est de savoir pourquoi vous utilisez eval en premier lieu? Je suppose que vous utilisez LWP::UserAgent et à moins que vous n'implémentiez votre propre objet de requête, la méthode 'request` n'est pas susceptible de mourir.

Ainsi, pourquoi ne pas utiliser simplement:

$response = $ua->request($r); 

?

+0

car cette ligne de code est en train de mourir et provoque une erreur de serveur interne lorsque j'essaie de l'exécuter sur une requête https. – user105033

+0

Ce que Sinan essayait de dire de sa manière charmante était: Envelopper le code mourant dans un eval ne fera pas fonctionner le code. – innaM

+1

@Manni Je tapais rapidement ;-) Pour tous ceux qui rencontrent ce thread, la façon d'éviter de mourir sur une requête https est de lire le document README.SSL fourni avec LWP. Voir aussi http://stackoverflow.com/questions/1228572/other-way-to-send-https-request-in-perl-without-lwpuseragent-and-httprequest/1228730#1228730 –

Questions connexes