2009-02-16 8 views
2

J'ai besoin d'aide pour comprendre l'extrait de code Perl suivant. J'ai les deux questions suivantes.Que signifie * PIPER en Perl?

1. Que signifie le code *PIPER local? Même si j'ai fait quelques programmations Perl avant que la syntaxe local * ne soit nouvelle pour moi. Est-ce un pointeur?

2. Quel est le but de

curl http://www.somesite.net/cgi-bin/updateuser.cgi? -d "userid=$userid&password=$password\" -s |"; ? 

Merci :)

local *PIPER; 

$http_query = "curl http://www.somesite.net/cgi-bin/updateuser.cgi? -d \"userid=$userid&password=$password\" -s |"; 

open(PIPER,$http_query) or die "sorry"; 

while(<PIPER>) 
{ 
    $rets = $_; 

} 

close(PIPER); 

return $rets; 
+0

Je voudrais ajouter que ce morceau de code est plutôt mal écrit à mon humble avis. Curl est disponible en tant que bibliothèque, il n'y a aucune raison de recourir à des commandes externes. –

+0

CPAN.pm n'utilise-t-il pas curl par défaut? Ou au moins dans certains cas? Je n'ai jamais utilisé curl moi-même, mais je l'ai vu apparaître lors de l'utilisation du module CPAN. –

+0

Non, CPAN.pm n'utilise pas curl par défaut. Il essaie d'abord Perl pur, mais si libwww-perl n'est pas installé, il doit revenir à autre chose. –

Répondre

10

1) "*PIPER" est un typeglob. C'est "$PIPER", "@PIPER", et "%PIPER" (et je puis certains) tout en un. Ils déclarent tous les noms *PIPER locaux à l'extrait de code que vous avez.

2) C'est une commande shell. Il se termine par |, ce qui signifie que cette commande est en cours d'exécution et que sa sortie est connectée en tant qu'entrée pour le handle de fichier PIPER. Le programme lit ensuite cette ligne-par-ligne avec while(<PIPER>), mais vous le savez déjà.

Je ne sais pas grand-chose sur curl, mais je sais que c'est un programme en ligne de commande pour faire des choses sur Internet. Juste un coup aléatoire, votre code semble accéder au script CGI d'un site Web et lui envoyer des informations.

+0

Pour une documentation un typeglobs regarder http://www.perl.com/doc/manual/html/pod/perldata.html – Xn0vv3r

+0

Merci Chris, votre explication a vraiment aidé :) –

+1

Dans les jours qui précèdent 'use FileHandle;' ou des modules connexes, c'était la manière standard de se munir d'un 'handle de fichier' local. Ces jours-ci, vous n'avez normalement pas besoin de cette notation - mais STDERR, STDOUT, STDIN sont des reliques de cette époque révolue. –

3

local *PIPER; indique que le descripteur de fichier PIPER est local. Étant donné que les descripteurs de fichiers n'ont pas leur propre symbole de type, ils doivent être interceptés par typeglobs pour être déclarés locaux.

curl est similaire à wget; il est utilisé pour transférer une URL. Voir man curl pour plus de détails, mais le commutateur -d (données) transmet la chaîne suivante en tant que données dans une opération POST et le commutateur -s (silencieux) supprime la sortie d'erreur et une progression.

1

2) Cette invocation réelle de boucle envoie une requête HTTP POST avec le texte \ "userid = $ userid & password = mot de passe $ \" à http://www.somesite.net/cgi-bin/updateuser.cgi? et renvoie la réponse du serveur (au tube). L'indicateur -s supprime la sortie de tout sauf de ce qui vient du serveur (comme les messages d'erreur ou les indicateurs de progression).

6

Comme d'autres l'ont noté, *PIPER est un typeglob afin que vous puissiez dynamiquement définir le handle de fichier PIPER. C'est l'ancien Perl cependant. Utilisez un descripteur de fichier lexical à la place:

 
sub foo { 
    my $http_query = "..."; 

    open my($piper), $http_query or die "sorry"; 

    while() 
     { 
     $rets = $_; 
     } 

    return $rets; 
    } 

Vous n'avez pas besoin de faire tout cela pour envoyer une requête POST à ​​un serveur bien. Vous pouvez le faire complètement dans Perl en utilisant LWP.