$!= 0 perl中语法不清楚

时间:2013-09-17 06:36:14

标签: perl syntax proxy socks

我试图理解这个$!= 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)的内容

3 个答案:

答案 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

更多详情:http://perldoc.perl.org/perlvar.html

答案 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
   ...
}