我试图理解这个$!= 0,我的主管在这个链接中给了我鳕鱼:http://codepaste.ru/1374/但是她改变了这部分鳕鱼:
while($client || $target) {
my $rin = "";
vec($rin, fileno($client), 1) = 1 if $client;
vec($rin, fileno($target), 1) = 1 if $target;
my($rout, $eout);
select($rout = $rin, undef, $eout = $rin, 120);
if (!$rout && !$eout) { return; }
my $cbuffer = "";
my $tbuffer = "";
if ($client && (vec($eout, fileno($client), 1) || vec($rout, fileno($client), 1))) {
my $result = sysread($client, $tbuffer, 1024);
if (!defined($result) || !$result) { return; }
}
到此:
while($client || $target) {
my $rin = "";
vec($rin,fileno($client),1) = 1 if $client;
vec($rin,fileno($target),1) = 1 if $target;
my($rout,$eout);
select($rout = $rin,undef,$eout = $rin,120);
break_pipe() if !$rout && !$eout;
my($cbuf,$tbuf);
if($client && (vec($eout,fileno($client),1) || vec($rout,fileno($client),1))){
$! = 0;
my $result = sysread($client,$tbuf,$packet_length);
我已经搜索过,但我没有在perl
中找到任何类似这种语法($!= 0)的内容答案 0 :(得分:1)
来自Perldoc:
$!
When referenced, $! retrieves the current value of the C errno integer variable.
If $! is assigned a numerical value, that value is stored in errno .
When referenced as a string, $! yields the system error string corresponding to errno .
Many system or library calls set errno if they fail, to indicate the cause of failure.
They usually do not set errno to zero if they succeed.
This means errno , hence $! , is meaningful only immediately after a failure
答案 1 :(得分:0)
是$!
是在Perl程序执行期间可能发生的错误状态变量
正如您的问题指出为什么$!
往往具有值0
我想补充一下,
执行开始前errno($!
)的初始值为零。
由于调用可能失败的其他库函数,许多库函数可以将errno设置为非零值。您应该假设任何库函数都可能改变errno。
希望它有所帮助。还要评论是否有任何查询
答案 2 :(得分:0)
$!
包含失败时系统调用的错误号和错误消息。据推测,您的新代码看起来像
$! = 0;
sysread(...);
if ($!) {
# Error. Error message in $!
...
}
那是错的。 sysread
没有义务在成功时保持$!
不受影响,因此在致电$!
之前更改sysread
是无用的。
如果要检查错误,请检查是否已定义sysread
的结果。如果不是,$!
将是有意义的。
my $rv = sysread(...);
if (!defined($rv)) {
# Error. Error message in $!
...
}
elsif (!$rv) {
# End of file
...
}
else {
# Data read
...
}