4

次の Perl スクリプトのスニペットを考えてみましょう。

use IO::Socket;
# ...
my $sock = IO::Socket::INET->new(
    PeerAddr => $host, # e.g. "google.com"
    PeerPort => $port, # e.g. 80
    Proto => 'tcp'
);
die("no socket: $!") unless $sock;
# ...

通常の状態ではすべてが期待どおりに機能しますが、ホスト システムのインターネット接続が非アクティブになると、「sock」変数が空になり$!、「無効な引数」というメッセージが表示されます。

INET コンストラクターを不適切に使用していますか、それともこれは予期された動作ですか? 後者の場合、「ネットワーク インターフェイスが非アクティブ」エラーとコンストラクタ メソッドへの真の無効な引数を区別する方法はありますか?

4

1 に答える 1

8

コンストラクターがホスト名を解決しようとしてエラーを取得し、 に戻るため、「無効な引数」が表示EINVALされ$!ます。で IP アドレスを使用すると$host、「Network is unreachable」という実際のエラーが表示されます。

また、 で返されたエラーを修飾するようにIO::Socket::INET設定します。そのため、と同様に印刷すると、「Bad hostname 'google.com'」と表示されます。これは、IP アドレスで得られる「Network unreachable」よりも優れた診断である可能性があります。ホスト名の代わりに。どちらの場合も、何が起こっているのかすぐにわかるはずです。$@$!$@$!

于 2011-05-23T22:13:54.580 に答える