perl – 标量值错误(使用IO :: Socket)
这是我目前的代码:
#!/usr/bin/perl -w use strict; require IO::Socket; while (<>) { chomp(my $host = $_); my @header; print "Connecting to: $hostn"; my $socket = new IO::Socket::INET( PeerAddr => $host,PeerPort => 80,Proto => 'tcp') || print "Could not connect: $!n"; print "Connected.n"; print $socket "GET / HTTP/1.0nn"; my $i = 0; while (<$socket>) { @header[$i] = $_; $i++; } $i = 0; print "--------------------------------------n"; while ($i <= 8) { print "@header[$i++]"; } print "-------------------------------------n"; print "Finished $hostnn"; } 如果在浏览IP列表时,主机已关闭,而不是继续下一个IP,它将给出一个错误“不能使用字符串(”1“)作为符号引用,而”严格引用“使用”. 如果我然后更改@header [$i] = $;到$he??ader [$i] = $;我也得到了同样的错误.如何使这个脚本更好. 解决方法
问题在于你设置$socket的方式:
my $socket = new IO::Socket::INET( PeerAddr => $host,Proto => 'tcp') || print "Could not connect: $!n"; 因为你正在使用||运算符,其具有比=更高的precedence,此语句被解析为 my $socket = (new IO::Socket::INET(...) || print ...); 如果新IO :: Socket :: INET返回false值(如果连接失败则会执行),将执行打印并将其返回值(通常为1)分配给$socket. print $socket "GET / HTTP/1.0nn"; Perl注意到值1实际上不是对象引用并抛出您报告的错误. 如果您使用低优先级运算符或代替||,$socket的值将是undef而不是1,并且您收到的错误消息将类似于无法使用未定义的值作为符号引用….当然,这实际上不会解决您的问题,但至少它可能使诊断更容易. 要真正解决问题,您需要修复代码,以便在连接失败时不会继续执行循环体的其余部分.一种方法是这样的: my $socket = new IO::Socket::INET( PeerAddr => $host,Proto => 'tcp'); unless ($socket) { print "Could not connect: $!n"; next; # skip the rest of the loop } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |