gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 22:49:53 27 4
gpt4 key购买 nike

这是我当前的代码:

#!/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";
}

如果在浏览 IP 列表时,主机关闭,而不是继续访问下一个 IP,它会给我一个错误“不能使用字符串(“1”)作为符号引用,而“严格引用”在用”。

如果我再改变@header[$i] = $;到 $header[$i] = $;我也得到同样的错误。我怎样才能使这个脚本更好。

最佳答案

问题在于您设置的方式 $socket :

my $socket = new IO::Socket::INET(
PeerAddr => $host,
PeerPort => 80,
Proto => 'tcp') || print "Could not connect: $!\n";

由于您使用的是 ||运算符,具有更高的 precedence= ,这个语句被解析为
my $socket = (new IO::Socket::INET(...) || print ...);

new IO::Socket::INET返回一个假值(就像连接失败时一样), print将被执行并且它的返回值(通常是 1 )将被分配给 $socket .
当您尝试使用 $socket 时作为 indirect object在声明中:
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
}

关于perl - 标量值错误(使用 IO::Socket),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9221097/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com