2011-06-12 30 views
0

书面用Perl CGI应用程序,有如下的代码登录游客。

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

中的perldoc,

包模板,LIST

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

+0

我有强烈的怀疑,这不会做我认为它想做的事情。您要求提供四件事,但“$数字”只包含一个。你会分裂一个文字'\ .'等,但下面提供的'Socket :: inet_aton'解决方案更好。 – tchrist 2011-06-12 13:18:08

+1

再次检查代码。你有什么不会编译。即使在你解决这个问题之后,我相信它与这本书不符。根据书中的许多正面评论,如果Meltzer和Michalski提倡改变'$ ENV {REMOTE_ADDRESS}'的价值,我会感到非常惊讶。 – daotoad 2011-06-12 15:29:16

+0

他没有改变环境变量。这个想法是将该值复制到$数字中,并修改副本*。这并不意味着整个代码片段不是废话,因为我认为它是。 – bart 2011-06-12 21:39:06

回答

2

请原谅d您提到的pack文档。 C的模板是:

C An unsigned char (octet) value. 

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

7

您的代码看起来像是代码中的一个破碎的摘录,用于将点分布式格式的IP地址转换为可传递给socket调用的四字节字符串。

假设#ENV$ENV的错误,您的代码将从点阵中去掉点,给出4到12位数字的字符串。然后它(隐含地)将这些数字解释为一个整数,将其最低有效位8位放在结果的第一个字节中,并用零填充其余位(因为pack为三个缺少的列表元素提供空值,然后将其解释为零)。

为什么你想打印一个二进制IP地址到日志文件,我不会试图猜测。但是,给出的代码接近于无稽之谈。如果你需要一个二进制IP地址的东西,我推荐

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

my $ host = gethostbyaddr($ address,AF_INET);如果此代码正常工作,它会记录原始地址。 – Weiyan 2011-06-13 13:57:37

+0

@魏延艳优秀。 'inet_aton'或多或少是为这种用途而设计的。 – LHMathies 2011-06-13 14:18:08