我尝试使用 Strawberry Perl,而让我难过的事情之一就是阅读文件。
我试着做:
open(FH, "D:\test\numbers.txt");
但它找不到文件(尽管文件在那里,并且没有权限问题)。
等效代码(除文件名外的脚本 100% 相同)在 Linux 上运行良好。
我尝试使用 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)emp(formfeed)oo.exe”的文件。
单引号你的字符串,或者(最好)使用正斜杠。由于自 MS-DOS 2.0 之类的所有 DOS 和 Windows 版本在路径中都将 / 和 \ 视为相同,您不妨使用与 Perl 不冲突的版本 - 或 POSIX shell、ANSI C 和C++、awk、Tcl、Java 或 Python,仅举几例。POSIX 路径也更便携。
因此,您的代码应该open(FH, "D:/test/numbers.txt");
改为,以避免尝试打开名为“D:<TAB>est\numbers.txt”的文件
顺便说一句,您可以通过使用词法(而不是全局命名)文件句柄,一种 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,它是至关重要的。