0

私はこの $!=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) のようなものは見つかりませんでした

4

3 に答える 3

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
   ...
}
于 2013-09-17T11:24:38.690 に答える
0

Yes$!は、Perl プログラムの実行中に発生する可能性のあるエラー ステータスの変数です。

あなたの質問がなぜ$!値が0になる傾向があるのか​​ を示しているように

追加したいのですが、

実行開始前の errno( $!) の初期値は 0 です。

多くのライブラリ関数は、失敗する可能性のある他のライブラリ関数を呼び出した結果として、errno をゼロ以外の値に設定できます。ライブラリ関数によって errno が変更される可能性があると想定する必要があります。

それが役に立てば幸い。また、質問があればコメントしてください

于 2013-09-17T06:58:27.310 に答える