open()
当我使用包含尾随换行符的文件名调用 perl 的两个参数时,换行符被忽略。但是,三参数版本保留了换行符。
为什么行为不同?为什么换行符表面上被剥离了?
-- 文件“nl”不存在。做了
$ ls -1 nl; 触摸 nl; ls -1 nl ls: nl: 没有这样的文件或目录 荷兰语
-- 尝试三参数打开 "nl\n" → ENOENT
strace 显示了我期望的行为,FWIW。
$ perl -E 'open(F, "<", "nl\n") 或死 $!' -e 第 1 行没有这样的文件或目录。 $ strace -e trace=open perl -E 'open(F, "<", "nl\n") 或死 $!' 2>&1 | grep nl open("nl\n", O_RDONLY|O_LARGEFILE) = -1 ENOENT(没有这样的文件或目录)
-- 现在,试试双参数 open "nl\n" → 成功?
$ perl -E 'open(F, "nl\n") 或死 $!'
- 什么?为什么这行得通?让我们看看strace。
哦,它忽略了换行符:
$ strace -e trace=open perl -E 'open(F, "nl\n") 或死 $!' 2>&1 | grep nl 打开(“nl”,O_RDONLY|O_LARGEFILE)= 3
-- "nl" 仍然是那里唯一的文件
$ ls 荷兰语
背景:
$ perl -v
这是为 i686-linux-thread-multi 构建的 perl 5,版本 16,subversion 0 (v5.16.0)。