G'day Stackoverflowers,
私は、Perl のautodieプラグマの作成者です。このプラグマは、Perl のビルトインが失敗時に例外をスローするように変更します。これはFatalに似ていますが、レキシカル スコープ、拡張可能な例外モデル、よりインテリジェントなリターン チェック、およびはるかに優れたエラー メッセージを備えています。これは、Perl の将来のリリース (暫定的に 5.10.1+) でモジュールを置き換える予定Fatal
ですが、現在、Perl 5.8.0 以降の CPAN からダウンロードできます。
の次のリリースでは、(ノンブロッキング) オプションを使用したautodie
への呼び出しの特別な処理が追加されます。呼び出しが失敗すると、通常は例外が発生しますが、 usingの呼び出しが失敗すると、返された errno( ) が.flock
LOCK_NB
flock
autodie
flock
LOCK_NB
$!
EWOULDBLOCK
これは、人々が次のようなコードを書き続けることができるようにするためです。
use Fcntl qw(:flock);
use autodie; # All perl built-ins now succeed or die.
open(my $fh, '<', 'some_file.txt');
my $lock = flock($fh, LOCK_EX | LOCK_NB); # Lock the file if we can.
if ($lock) {
# Opportuntistically do something with the locked file.
}
上記のコードでは、他の誰かが既にファイルをロックしているために失敗したロック ( EWOULDBLOCK
) は、ハード エラーとは見なされないため、autodyingflock
は単に false 値を返します。ファイルロックをサポートしていないファイルシステムで作業している場合、またはネットワークファイルシステムとネットワークが停止したばかりの場合、エラー番号flock
がEWOULDBLOCK
.
これは、Unix フレーバー システムの私の開発バージョンでは問題なく動作しますが、Windows ではひどく失敗します。Windows の Perl はこのLOCK_NB
オプションをサポートしていますが、定義していないようEWOULDBLOCK
です。代わりに、ブロッキングが発生した場合に返される errno は 33 (「ドメイン エラー」) です。
明らかに、これを定数として にハードコーディングできますautodie
が、それはここでやりたいことではありません。私はそれを Windows の に相当するものと比較したいとPOSIX::EWOULDBLOCK
思っていますが、そのようなものがどこで定義されるかを見つけることはできません。お手伝いできることがあれば、お知らせください。
特に望まない回答:
- 定数としてハードコーディングすることを提案します (または、さらに悪いことに、マジック ナンバーを浮かび上がらせたままにします)。
LOCK_NB
Windows では機能をまったくサポートしていません。LOCK_NB
への呼び出しからの失敗は、flock
単に false を返す必要があると仮定します。- p5p またはperlmonksで私が尋ねる提案。私はすでにそれらについて知っています。
flock
、または例外、または機能の説明Fatal
。もう知っている。親密に。