Проблема в том, как вы установили $socket
:
my $socket = new IO::Socket::INET(
PeerAddr => $host,
PeerPort => 80,
Proto => 'tcp') || print "Could not connect: $!\n";
Поскольку вы используете оператор ||
, который имеет более высокий приоритет , чем =
, этот оператор анализируется как
my $socket = (new IO::Socket::INET(...) || print ...);
Если new IO::Socket::INET
возвращает ложное значение (как и в случае сбоя соединения), print
будет выполнено и будет возвращено его возвращаемое значение (обычно 1
) $socket
.
Когда вы затем попытаетесь использовать $socket
в качестве косвенного объекта в выражении:
print $socket "GET / HTTP/1.0\n\n";
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
}