[英]Why doesn't this path work to open a Windows file in PERL?
我尝试使用Strawberry Perl,其中一件难以理解的事情就是阅读文件。
我试着这样做:
open(FH, "D:\test\numbers.txt");
但它无法找到该文件(尽管该文件存在,并且没有权限问题)。
一个等效的代码(100%的脚本除了文件名相同)在Linux上运行良好。
根据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: $!";
或者,更好的是,不要在IO调用中对文件名进行硬编码(以下练习可能会让您更快地发现问题):
my $filename = "D:/test/numbers.txt";
open(my $fh, "<", $filename) or die "Could not open file $filename: $!";
不需要插值时,切勿使用插值字符串! 您正尝试从\\ t和\\ n中打开带有制表符和换行符的文件名。
如果不需要(或想要)插值,请使用单引号。
新手Perl程序员似乎遇到的最大问题之一就是他们会毫不犹豫地自动使用“”。 您需要了解“”和“”之间的区别,并且在键入之前需要始终考虑,以便选择正确的。 这是一个很难进入的习惯,但如果你要编写好的Perl,这一点至关重要。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.