2009-02-16 6 views
2

Мне нужна помощь в понимании следующего фрагмента кода Perl. У меня следующие два вопроса.Что означает * PIPER в 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; 
+0

Я хотел бы добавить, что этот фрагмент кода довольно плохо написан ИМХО. Curl доступен как библиотека, нет причин прибегать к использованию внешних команд. –

+0

Не работает ли CPAN.pm по умолчанию? Или, по крайней мере, в некоторых случаях? Я никогда не использовал завиток, но я видел, как он всплывал при использовании модуля CPAN. –

+0

Нет, CPAN.pm по умолчанию не использует завиток. Сначала он пробует чистый Perl, но если libwww-perl не установлен, ему нужно вернуться к чему-то другому. –

ответ

10

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

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

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

+0

Для документации вид globs смотрите на http://www.perl.com/doc/manual/html/pod/perldata.html – Xn0vv3r

+0

Спасибо Крису, ваше объяснение действительно помогло :) – 2009-02-16 07:22:27

+1

В дни, прежде чем использовать FileHandle; или связанные модули, это был стандартный способ предоставить вам локальный «дескриптор файла». В эти дни вам обычно не нужны эти обозначения, но STDERR, STDOUT, STDIN - это мощи прошлой эпохи. –

3

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

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

1

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

6

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

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

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

    while() 
     { 
     $rets = $_; 
     } 

    return $rets; 
    } 

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