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

时间:2012-02-13 18:19:54

标签: windows perl io backslash path-separator

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

我试着这样做:

open(FH, "D:\test\numbers.txt");

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

等效代码(除文件名以外的100%脚本相同)在Linux上运行良好。

2 个答案:

答案 0 :(得分: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操作来进一步改进你的代码,尤其是{{1}调用:

open()

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

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

答案 1 :(得分:1)

不需要插值时,切勿使用插值字符串!您正尝试从\ t和\ n中打开带有制表符和换行符的文件名。

当您不需要(或想要)插值时,请使用单引号。

新手Perl程序员似乎遇到的最大问题之一就是他们会毫不犹豫地自动使用“”。您需要了解“”和“”之间的区别,并且在键入之前需要始终考虑,以便选择正确的。这是一个很难进入的习惯,但是如果你要编写好的Perl,这是至关重要的。