open()
末尾の改行を含むファイル名でperl の 2 つの引数を呼び出すと、改行が無視されます。ただし、引数が 3 つのバージョンでは改行が保持されます。
なぜ動作が異なるのですか?表向きは改行が取り除かれているのはなぜですか?
-- ファイル「nl」が存在しません。成功する
$ ls -1 nl; nlに触れてください。ls -1 nl ls: nl: そのようなファイルまたはディレクトリはありません nl
-- "nl\n" → ENOENT を 3 引数で開く
strace は、私が期待する動作を示しています。FWIW.
$ perl -E 'open(F, "<", "nl\n") or die $!' -e 行 1 にそのようなファイルまたはディレクトリはありません。 $ strace -e trace=open perl -E 'open(F, "<", "nl\n") or die $!' 2>&1 | grep nl open("nl\n", O_RDONLY|O_LARGEFILE) = -1 ENOENT (そのようなファイルまたはディレクトリはありません)
-- では、2 引数の open "nl\n" を試してください → 成功 ?
$ perl -E 'open(F, "nl\n") or die $!'
- 何?なぜそれがうまくいったのですか?strace を見てみましょう。
ああ、それは改行を無視しています:
$ strace -e trace=open perl -E 'open(F, "nl\n") or die $!' 2>&1 | grep nl 開く ("nl", O_RDONLY|O_LARGEFILE) = 3
-- 「nl」はまだそこにある唯一のファイルです
$ ls nl
バックグラウンド:
$ パール -v
これは、i686-linux-thread-multi 用にビルドされた perl 5、バージョン 16、subversion 0 (v5.16.0) です。