书面用Perl CGI应用程序,有如下的代码登录游客。
(my $digits = #ENV{'REMOTE_ADDR'}) =~ s/\.//g;
my $address = pack("C4", $digits);
中的perldoc,
包模板,LIST
“C4”应该是模板,这是什么意思?
书面用Perl CGI应用程序,有如下的代码登录游客。
(my $digits = #ENV{'REMOTE_ADDR'}) =~ s/\.//g;
my $address = pack("C4", $digits);
中的perldoc,
包模板,LIST
“C4”应该是模板,这是什么意思?
您的代码看起来像是代码中的一个破碎的摘录,用于将点分布式格式的IP地址转换为可传递给socket
调用的四字节字符串。
假设#ENV
是$ENV
的错误,您的代码将从点阵中去掉点,给出4到12位数字的字符串。然后它(隐含地)将这些数字解释为一个整数,将其最低有效位8位放在结果的第一个字节中,并用零填充其余位(因为pack
为三个缺少的列表元素提供空值,然后将其解释为零)。
为什么你想打印一个二进制IP地址到日志文件,我不会试图猜测。但是,给出的代码接近于无稽之谈。如果你需要一个二进制IP地址的东西,我推荐
use Socket 'inet_aton';
my $address = inet_aton($ENV{REMOTE_ADDR});
我有强烈的怀疑,这不会做我认为它想做的事情。您要求提供四件事,但“$数字”只包含一个。你会分裂一个文字'\ .'等,但下面提供的'Socket :: inet_aton'解决方案更好。 – tchrist 2011-06-12 13:18:08
再次检查代码。你有什么不会编译。即使在你解决这个问题之后,我相信它与这本书不符。根据书中的许多正面评论,如果Meltzer和Michalski提倡改变'$ ENV {REMOTE_ADDRESS}'的价值,我会感到非常惊讶。 – daotoad 2011-06-12 15:29:16
他没有改变环境变量。这个想法是将该值复制到$数字中,并修改副本*。这并不意味着整个代码片段不是废话,因为我认为它是。 – bart 2011-06-12 21:39:06