2

我需要一些帮助来理解以下 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

4 回答 4

10

1) " *PIPER" 是一个类型团。它是“ $PIPER”、“ @PIPER”和“ %PIPER”(然后是一些)合而为一。他们将所有*PIPER名称声明为您拥有的代码片段的本地名称。

2)这是一个shell命令。它以 a 结尾,|这意味着该命令正在运行,并且它的输出作为 filehandle 的输入被输入PIPER。然后程序用 逐行读取while(<PIPER>),但你已经知道了。

我不太了解curl,但我知道它是一个用于在 Internet 上进行操作的命令行程序。只是随机刺伤,您的代码似乎正在访问网站的 CG​​I 脚本并向其发送一些信息。

于 2009-02-16T07:09:46.577 回答
6

正如其他人所指出的,*PIPER它是一个 typeglob,因此您可以动态地确定 PIPER 文件句柄的范围。不过那是古老的 Perl。改用词法文件句柄:

子富{
    我的 $http_query = "...";

    打开我的($piper),$http_query 或死“对不起”;

    尽管()
        {
        $rets = $_;
        }

    返回$rets;
    }

不过,您无需执行任何操作即可将 POST 请求发送到服务器。您可以使用LWP在 Perl 中完全做到这一点。

于 2009-02-16T23:08:10.610 回答
3

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

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

于 2009-02-16T07:22:46.280 回答
1

2) 这个 curl 的实际调用会发送一个带有文本“userid=$userid&password=$password”的 HTTP POST 请求到 http://www.somesite.net/cgi-bin/updateuser.cgi?并输出来自服务器的响应(到管道)。-s 标志从任何内容中去除输出,除了来自服务器的内容(例如错误消息或进度表)。

于 2009-02-16T07:32:34.430 回答