这个问题几乎让我发疯(在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调试器中打印函数调用的结果(但只有在将它分配给变量之后)。
这也是我所知道的唯一一个在使用正确参数调用时输出使用错误的函数。
谁能解释一下?
这不是调试器的问题,它是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);
它可以通过传递给函数的参数数量和函数调用的上下文来判断请求哪个操作,并在两者不一致时发出警告。