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)