尽管我猜想这是变量内对象的某种默认评估或行为,但无法找到此语法(<$SOCKET>
)的作用。
我试图使用此可能是DoS探针(在100次循环内)测试Apache服务器(安装了 mod_evasive 模块之后),但它始终返回一个响应 400错误的请求。尝试解密代码,我陷入了下面的注释行。
use IO::Socket;
use strict;
my($response);
my($SOCKET) = new IO::Socket::INET( Proto => "tcp",
PeerAddr=> "127.0.0.1:80");
if (! defined $SOCKET) { die $!; }
print $SOCKET "GET / HTTP/1.1\n\n";
$response = <$SOCKET>; ## What are those < > signs???
print $response;
close($SOCKET);
然后我的主要兴趣是能够进行测试,所以我首先需要知道为什么我得到400错误代码来对其进行修复。
不过,顺便说一句,顺便说一句,出于好奇,我想了解<$SOCKET>
的语法含义,因为在任何地方都找不到它的解释。
答案 0 :(得分:6)
< >
(也称为“钻石操作员”)是readline
的简写。括号内的东西提供了输入行。那可能是文件句柄,管道,套接字或其他类似的东西。在您的情况下,变量$SOCKET
存储了您创建的套接字。
对<$SOCKET>
的调用从该输入中读取下一行。
虽然有一些技巧。在其他一些情况下,< >
是glob
的简写。如果角度内的东西看起来像是球形模式,则< >
返回与该模式匹配的文件列表:
my @files = <*.txt>;
您可能会看到一些旧语法;我更喜欢把它拼出来:
my @files = glob( '*.txt' );
答案 1 :(得分:3)
<>
的意思是readline(ARGV)
<IDENTIFIER>
的意思是readline(IDENTIFIER)
<$IDENTIFIER>
的意思是readline($IDENTIFIER)
<...>
(其他任何意思)表示glob(qq<...>)
您使用的是第三种语法,因此<$SOCKET>
的意思是readline($SOCKET)
。您在标量上下文中使用它,因此它从$SOCKET
中读取一行。