我需要一些帮助来理解以下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;
答案 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捕获它们才能被声明为本地。
curl
与wget
类似;它用于传输URL。有关详细信息,请参阅man curl
,但-d
开关(数据)在POST操作中将以下字符串作为数据传递,-s
开关(静音)禁止错误输出和进度表
答案 3 :(得分:1)
2)curl的实际调用会发送带有文本的HTTP POST请求 \ “用户ID = $用户ID和放大器;密码= $密码\” 至 http://www.somesite.net/cgi-bin/updateuser.cgi? 并从服务器(到管道)输出响应。 -s标志剥离除服务器外的任何内容(例如错误消息或进度表)的输出。