这是我目前的代码:
#!/usr/bin/perl -w
use strict;
require IO::Socket;
while (<>) {
chomp(my $host = $_);
my @header;
print "Connecting to: $host\n";
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.0\n\n";
my $i = 0;
while (<$socket>) {
@header[$i] = $_;
$i++;
}
$i = 0;
print "--------------------------------------\n";
while ($i <= 8) {
print "@header[$i++]";
}
print "-------------------------------------\n";
print "Finished $host\n\n";
}
Run Code Online (Sandbox Code Playgroud)
如果在浏览IP列表时,主机已关闭,而不是继续到下一个IP,它将给出一个错误"不能使用字符串("1")作为符号引用,而"严格引用"使用".
如果我然后更改@header [$ i] = $ ; 到$ header [$ i] = $ ; 我也得到了同样的错误.如何使这个脚本更好.
Ilm*_*nen 10
问题出在你设置的方式$socket:
my $socket = new IO::Socket::INET(
PeerAddr => $host,
PeerPort => 80,
Proto => 'tcp') || print "Could not connect: $!\n";
Run Code Online (Sandbox Code Playgroud)
由于您使用的优先级高于||运算符,因此将此语句解析为=
my $socket = (new IO::Socket::INET(...) || print ...);
Run Code Online (Sandbox Code Playgroud)
如果new IO::Socket::INET返回false值(如果连接失败则返回),print将执行该命令并将其返回值(通常是1)分配给$socket.然后,当您尝试在语句中$socket用作间接对象时:
print $socket "GET / HTTP/1.0\n\n";
Run Code Online (Sandbox Code Playgroud)
Perl注意到该值1实际上不是对象引用并抛出您报告的错误.
如果您使用的是低优先级运算符or而不是||,那么它的值$socket将被undef替换为1,而您收到的错误消息将是类似的Can't use an undefined value as a symbol reference ....当然,这实际上并没有解决您的问题,但至少它可能使诊断更容易.
要真正解决问题,您需要修复代码,以便在连接失败时不会继续执行循环体的其余部分.一种方法是这样的:
my $socket = new IO::Socket::INET(
PeerAddr => $host,
PeerPort => 80,
Proto => 'tcp');
unless ($socket) {
print "Could not connect: $!\n";
next; # skip the rest of the loop
}
Run Code Online (Sandbox Code Playgroud)