【问题标题】:Why doesn't this path work to open a Windows file in PERL?为什么此路径不能在 PERL 中打开 Windows 文件?
【发布时间】:2012-02-13 18:19:54
【问题描述】:

我尝试使用 Strawberry Perl,其中一件事让我很头疼,就是读取文件。

我尝试过:

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

但它找不到文件(尽管文件在那里,并且没有权限问题)。

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

【问题讨论】:

    标签: windows perl io backslash path-separator


    【解决方案1】:

    根据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: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: $!";
    

    【讨论】:

    • +1 但是您到底是如何找到问题、阅读并在 1 分 8 秒内写下答案的?
    • @TLP - 对于前者 - Feed Notifier(感谢它,我刚刚在 SciFi&Fantasy SE 上获得了 Epic 徽章!)+ Perl 标签的随机刷新。对于后者(引用哈利波特的话) - 纯粹是愚蠢的运气!我已经通过为同事回答 100% 相同的问题打开了常见问题解答。在工作中提供帮助是有回报的! :)
    • @TLP - 要么,要么我是 Jon Skeet 的转世。至少他的速度技能,如果不是其他人的话:)
    【解决方案2】:

    当您不需要插值时,切勿使用插值字符串!您正在尝试从 \t 和 \n! 中打开一个包含制表符和换行符的文件名!

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

    新手 Perl 程序员似乎遇到的最大问题之一是他们不假思索地自动使用 "" 表示所有内容。您需要了解 "" 和 '' 之间的区别,并且您需要在输入之前始终三思,以便选择正确的。这是一个很难养成的习惯,但如果您要编写好的 Perl,这一点至关重要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-27
      • 2016-07-23
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 2021-09-01
      相关资源
      最近更新 更多