标量值错误(使用IO :: Socket)

Dav*_*red 4 perl

这是我目前的代码:

#!/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] = $ ; 到$ he​​ader [$ 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)