我一直在一个CPAN模块的一个叉子上工作,这个模块现在没有被保护(据我所知).在这个模块中,他们使用$@将错误消息传递给堆栈.换句话说,如果在子程序的任何调用中出现任何问题,他们设置$@,并且在调用之后检查它是否被设置.我以前从未看过这个变量,但我认为这是有用的,所以我开始在代码中使用相同的方法.现在我最近读了一下,发现它的目的比这更窄一些.阅读
perlvar(和其他SO问题)并没有完全解决这个问题,但是,这样使用$@可以吗?我知道的一些“标点符号”变量绝对不能以这种通用方式使用(有些甚至是本地的),这是这些情况之一,还是我可以继续这种做法吗?
解决方法
$@是Perl中相对“特殊”的特殊变量. Perl中没有任何内容从$@读取,最后只能由eval {}块写入.这使得使用自己的错误信号相对安全.
特别地,模块的核心IO :: Socket树使用它来指示构造函数的失败:
use IO::Socket::IP; my $sock = IO::Socket::IP->new(...) or die "Cannot connect - $@";
更传统的$!这里不合适,因为$!具有包装libc级错误构造的魔法;这意味着它只能设置为整数errno值,即使它可以读取为数字或字符串.因为有时可能会发生与errno值直接相关的失败(在IO :: Socket的情况下,例如多种解析器故障),有时候是$!是不适合这个.