在perl中打包('C4',$ digits)

时间:2011-06-12 12:14:19

标签: perl cgi

在使用Perl编写CGI应用程序时,请使用以下代码记录访问者。

(my $digits = #ENV{'REMOTE_ADDR'}) =~ s/\.//g;
my $address = pack("C4", $digits);

在perldoc,

  

打包模板,列表

“C4”应该是模板。这是什么意思?

2 个答案:

答案 0 :(得分:7)

您的代码看起来像代码中的一个错误提取,用于将点分四格式的IP地址转换为可传递给socket调用的四个字节的字符串。

假设#ENV$ENV的错误,您的代码会从虚线四边形中删除点,为您提供一个4到12位的字符串。然后(隐式地)将这些数字解释为单个整数,将其最低8位放在结果的第一个字节中,并用零填充其余数字(因为pack为三个缺少的列表元素提供空值,然后被解释为零。

为什么要将二进制IP地址打印到日志文件中,我不会尝试猜测。但是给出的代码几乎是胡说八道。如果您确实需要二进制IP地址,我建议

use Socket 'inet_aton';
my $address = inet_aton($ENV{REMOTE_ADDR});

答案 1 :(得分:2)

请阅读您提及的pack文档。 C的模板是:

C  An unsigned char (octet) value.

所以C4是四个无符号字符。