这个问题几乎使我发疯(在Perl调试器中运行):
DB<3> x sockaddr_in(123, inet_aton('localhost'))
usage: (port,iaddr) = sockaddr_in(sin_sv) at (eval 7)[/usr/lib/perl5/5.18.2/perl5db.pl:732] line 2.
但是:
DB<10> x $a = sockaddr_in(123, inet_aton('localhost'))
0 "\cB\c@\c@{\c?\c@\c@\cA\c@\c@\c@\c@\c@\c@\c@\c@"
这是我知道的唯一一个示例,在该示例中,我无法直接在Perl调试器中打印函数调用的结果(但仅在将其分配给变量之后)。
这也是我所知道的唯一函数,当使用正确的参数调用该函数时会输出使用错误。
谁能解释?
答案 0 :(得分:2)
这与调试器无关,它是sockaddr_in
在列表上下文中与两个参数一起使用时发出的警告。
$ perl -MSocket -wE 'say length(sockaddr_in(123,inet_aton("localhost")))'
16
$ perl -MSocket -wE 'say sockaddr_in(123,inet_aton("localhost"))'
usage: (port,iaddr) = sockaddr_in(sin_sv) at -e line 1.
sockaddr_in
有两种调用语法。它可以将未打包的端口和地址转换为打包的套接字地址(将两个元素的列表转换为标量),也可以将打包的套接字地址转换为端口和地址(将标量转换为两个元素的列表)。
$sockaddr = sockaddr_in($port,$ip_address);
($port,$ip_address) = sockaddr_in($sockaddr);
它可以通过传递给函数的参数数量和函数调用的上下文来判断请求哪个操作,并在两者不一致时发出警告。