2 Stimmen

Was bedeutet *PIPER in Perl?

Ich brauche Hilfe beim Verständnis des folgenden Perl-Code-Schnipsels. Ich habe die folgenden zwei Fragen.

1. Was bedeutet lokale *PIPER bedeuten? Auch wenn ich schon einige Perl-Programmierungen gemacht habe, bevor die local * Die Syntax ist neu für mich. Ist es ein Zeiger?

2. Was ist der Zweck von

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

Dankeschön :)

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;

10voto

Chris Lutz Punkte 69879

1) " *PIPER " ist ein Typglob. Es ist " $PIPER ", " @PIPER " und " %PIPER " (und dann noch einige mehr) in einem. Sie erklären, dass alle *PIPER Namen, die sich auf den Codeausschnitt beziehen, den Sie haben.

2) Das ist ein Shell-Befehl. Er endet mit einem | was bedeutet, dass dieser Befehl ausgeführt wird und seine Ausgabe als Eingabe für den Filehandle in die Pipeline geleitet wird PIPER . Das Programm liest dann diese Zeile für Zeile mit while(<PIPER>) aber das wissen Sie ja bereits.

Ich weiß nicht viel über curl aber ich weiß, dass es ein Kommandozeilenprogramm ist, mit dem man Dinge im Internet erledigen kann. Ihr Code scheint auf ein CGI-Skript einer Website zuzugreifen und diesem einige Informationen zu senden.

6voto

brian d foy Punkte 124323

Wie andere bereits festgestellt haben, *PIPER ist ein Typglob, so dass Sie den PIPER-Filehandle dynamisch einschränken können. Das ist allerdings ein altes Perl. Verwenden Sie stattdessen einen lexikalischen Filehandle:

sub foo {
    my $http\_query = "...";

    open my($piper), $http\_query or die "sorry";

    while()
        {
        $rets = $\_;
        }

    return $rets;
    }

Sie müssen nichts davon tun, um eine POST-Anfrage an einen Server zu senden. Sie können dies vollständig in Perl erledigen, indem Sie LWP .

3voto

ruds Punkte 776

local *PIPER; ist die Erklärung der PIPER Dateihandle lokal zu sein. Da Dateihandles kein eigenes Typsymbol haben, müssen sie von typeglobs abgefangen werden, um als lokal deklariert zu werden.

curl ist vergleichbar mit wget ; er wird zur Übertragung einer URL verwendet. Siehe man curl für weitere Details, aber die -d Schalter (data) übergibt die folgende Zeichenkette als Daten in einem POST-Vorgang, und der -s Schalter (silent) unterdrückt die Fehlerausgabe und eine Fortschrittsanzeige.

1voto

2) Dieser aktuelle Aufruf von curl sendet eine HTTP-POST-Anforderung mit dem Text \"userid=$userid&password=$password\" an . http://www.somesite.net/cgi-bin/updateuser.cgi ? und gibt die Antwort des Servers (in die Pipe) aus. Mit dem Flag -s wird die Ausgabe von allem entfernt, was nicht vom Server kommt (wie Fehlermeldungen oder Fortschrittsanzeigen).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X