为什么这条路径不能在PERL中打开Windows文件?

use*_*883 2 windows io perl backslash path-separator

我尝试使用Strawberry Perl,其中一件难以理解的事情就是阅读文件.

我试着这样做:

open(FH, "D:\test\numbers.txt");
Run Code Online (Sandbox Code Playgroud)

但它无法找到该文件(尽管该文件存在,并且没有权限问题).

一个等效的代码(100%的脚本除了文件名相同)在Linux上运行良好.

DVK*_*DVK 13

根据Perl FAQ 5,您应该在DOS/Windows文件名中使用斜杠(或者,作为替代方法,转义反斜杠).

为什么我不能在DOS路径中使用"C:\ temp\foo"?为什么`C:\ temp\foo.exe`不起作用?

哎呦!您只需将选项卡和换页符放入该文件名即可!请记住,在双引号字符串("like\this")中,反斜杠是一个转义字符.这些完整列表在perlop中的Quote和Quote-like Operators中.不出所料,您的旧DOS文件系统上没有名为"c :( tab)emp(formfeed)oo"或"c:(tab)\ temp(formfeed)oo.exe"的文件.

要么单引号你的字符串,要么(最好)使用正斜杠.因为所有DOS和Windows版本都像MS-DOS 2.0那样在路径中处理/和\相同,所以你也可以使用不与Perl冲突的那个 - 或者POSIX shell,ANSI C和C++,awk,Tcl,Java或Python,仅举几例.POSIX路径也更便携.

因此,您的代码应该是open(FH, "D:/test/numbers.txt");,以避免尝试打开名为"D:<TAB>\test \numbers.txt"的文件


顺便说一下,你可以通过使用lexical(而不是全局命名的)filehandle,一个3参数形式的open来进一步改进你的代码,最重要的是,错误检查你的所有IO操作,特别是open()调用:

open(my $fh, "<", "D:/test/numbers.txt") or die "Could not open file: $!";
Run Code Online (Sandbox Code Playgroud)

或者,更好的是,不要在IO调用中对文件名进行硬编码(以下练习可能会让您更快地发现问题):

my $filename = "D:/test/numbers.txt";
open(my $fh, "<", $filename) or die "Could not open file $filename: $!";
Run Code Online (Sandbox Code Playgroud)