* PIPER在Perl中意味着什么?

时间:2009-02-16 07:04:29

标签: perl filehandle typeglob

我需要一些帮助来理解以下Perl代码段。我有以下两个问题。

1。 本地*PIPER是什么意思?即使我在local *语法之前完成了一些Perl编程,对我来说也是新的。它是指针吗?

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 个答案:

答案 0 :(得分:10)

1)“*PIPER”是一个typeglob。它是“$PIPER”,“@PIPER”和“%PIPER”(我还有一些)。他们声明您所拥有的代码段的所有*PIPER名称。

2)那是一个shell命令。它以|结束,表示正在运行该命令,并且它的输出作为文件句柄PIPER的输入进行管道输入。然后程序逐行读取while(<PIPER>),但您已经知道了。

我对curl了解不多,但我知道这是一个在互联网上做事的命令行程序。只是随机插入,您的代码似乎正在访问网站的CGI脚本并向其发送一些信息。

答案 1 :(得分:6)

正如其他人所说,*PIPER是一个typeglob,因此您可以动态调整PIPER文件句柄的范围。那是古老的Perl。改为使用词法文件句柄:

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

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

    while()
        {
        $rets = $_;
        }

    return $rets;
    }

您不需要执行任何操作即可向服务器发送POST请求。您可以使用LWP在Perl中完全执行此操作。

答案 2 :(得分:3)

local *PIPER;声明PIPER文件句柄是本地的。由于文件句柄没有自己的类型符号,因此需要使用typeglobs捕获它们才能被声明为本地。

curlwget类似;它用于传输URL。有关详细信息,请参阅man curl,但-d开关(数据)在POST操作中将以下字符串作为数据传递,-s开关(静音)禁止错误输出和进度表

答案 3 :(得分:1)

2)curl的实际调用会发送带有文本的HTTP POST请求 \ “用户ID = $用户ID和放大器;密码= $密码\” 至 http://www.somesite.net/cgi-bin/updateuser.cgi? 并从服务器(到管道)输出响应。 -s标志剥离除服务器外的任何内容(例如错误消息或进度表)的输出。