Что означает * PIPER в Perl? - PullRequest
2 голосов
/ 16 февраля 2009

Мне нужна помощь в понимании следующего фрагмента кода Perl. У меня есть следующие два вопроса.

1. Что значит местный *PIPER? Хотя я и занимался программированием на Perl до того, как синтаксис local * был для меня новым Это указатель?

2. Какова цель

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

Спасибо:)

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;

Ответы [ 4 ]

10 голосов
/ 16 февраля 2009

1) "*PIPER" - это типоглоб. Это "$PIPER", "@PIPER" и "%PIPER" (и я тогда немного) все в одном. Они объявляют все *PIPER имена локальные для вашего фрагмента кода.

2) Это команда оболочки. Он заканчивается |, что означает, что эта команда выполняется, а ее вывод передается в качестве ввода для дескриптора файла PIPER. Затем программа читает это построчно с while(<PIPER>), но вы уже знаете это.

Я не знаю много о curl, но я знаю, что это программа командной строки для работы в Интернете. Просто случайный удар, ваш код, по-видимому, обращается к CGI-сценарию веб-сайта и отправляет ему некоторую информацию.

6 голосов
/ 17 февраля 2009

Как уже отмечали другие, *PIPER - это типоглоб, поэтому вы можете динамически расширять дескриптор файла PIPER. Это древний Perl, хотя. Вместо этого используйте лексический дескриптор файла:

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

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

    while()
        {
        $rets = $_;
        }

    return $rets;
    }

Вам не нужно ничего делать, чтобы отправить POST-запрос на сервер. Вы можете сделать это полностью в Perl, используя LWP .

3 голосов
/ 16 февраля 2009

local *PIPER; объявляет дескриптор файла PIPER локальным. Поскольку дескрипторы файлов не имеют своего собственного символа типа, они должны быть перехвачены глобальными наборами, чтобы быть объявленными локальными.

curl аналогично wget; используется для передачи URL. См. man curl для получения более подробной информации, но переключатель -d (данные) передает следующую строку как данные в операции POST, а переключатель -s (без вывода сообщений) подавляет вывод ошибок и индикатор выполнения.

1 голос
/ 16 февраля 2009

2) Этот фактический вызов curl отправляет HTTP-запрос POST с текстом \ "= $ Идентификатор_пользователя идентификатор и пароль = $ пароль \" в http://www.somesite.net/cgi-bin/updateuser.cgi? и выводит ответ с сервера (на канал). Флаг -s удаляет выходные данные из всего, кроме того, что приходит с сервера (например, сообщения об ошибках или индикаторы выполнения).

...