【问题标题】:Cannot write to file with Perl in Windows 7无法在 Windows 7 中使用 Perl 写入文件
【发布时间】:2019-02-01 15:57:57
【问题描述】:

我安装了 Strawberry Perl 并且已经使用了一段时间。但是当我运行以下命令时,不会创建任何文件:

    open TEST, ">happy.txt";
    print TEST "contents";
    close TEST;

我在任何地方都找不到答案。我想知道这是否是一个许可的事情。我以管理员身份运行 Perl 命令提示符并使用绝对文件路径。我在2台win7电脑上试过。 其他人可以在 Windows 7 上使用 Perl 创建文件吗?

两个指针(prolly 仅适用于 win7) - 由于 Windows 中的反斜杠,路径应该使用单引号?
- 似乎应该使用完整路径。

这行得通:

open my $test, '>', 'D:\_docs\documents\perl\happy.txt' or die $!;
print $test "contents\n";
close $test or die $!;

注意:使用文件的路径。

【问题讨论】:

  • 试试open TEST, ">happy.txt" or die "Could not open happy for writing: $!";
  • 哇,简直太棒了 - 这很有效!我猜它需要 or die 异常选项?
  • @Tycon,不,当它不起作用时,它会告诉你问题是什么。它是否有效都不会改变。

标签: perl file windows-7


【解决方案1】:

您的代码本身没有任何错误会导致它失败。然而,它的问题在于它没有测试“打开”和“关闭”的返回值是否成功。没有测试,你不知道故障点在哪里。如果您测试失败,您可能会更好地了解问题所在。

我将提供您的代码的更新版本,用于测试失败,并在失败时输出错误消息。在此过程中,我将使用一些“最佳实践”,例如间接词法文件句柄和三参数打开:

open my $test, '>', 'happy.txt' or die $!;
print $test "contents\n";
close $test or die $!;

以这种方式运行代码将更明确地告诉您失败是什么(而不是静默失败)。特殊变量“$!”包含实际的错误消息。

【讨论】:

  • 是的,我认为这是导致我误入歧途的原因,我没有看到异常的原因,所以我没有费心寻找错误:-/ 我怀疑“错误”是一个警告该文件尚不存在。创建文件后,我尝试了没有或死亡,它似乎可以工作。 - 很高兴知道 - 谢谢一百万。
  • 其他一些事情 - 由于 Windows 中的反斜杠,路径应该使用单引号? - 似乎应该使用完整路径。
  • 不一定需要完整路径;)这取决于。如果您从与预期运行位置不同的工作目录运行脚本,并且您使用的是相对路径,那将是一个问题。另一方面,如果您希望路径与任意工作目录相关,则需要相对路径。此外,在路径中使用“/”而不是“\”,即使对于 Windows(在 Perl 中)也是如此。如果必须使用“\”,则必须转义反斜杠。
【解决方案2】:

我也找不到答案,不知道在哪里。在今天终于找到了这个解决方案之后,在我自己的 64 位 Windows 7 和 ActiveState 的 32 位 Perl 5.16.1 build 1601 上针对相同的基本问题进行了两天的数小时研究后,下面的内容可以为我解决问题为什么正常发布的语法似乎不起作用,我已经尝试了几十种排列,但直到今天才找到一个有效的排列 - 根据您的帖子和这里的答案。

以下是我的 Perl 示例 1 的输出消息

(我第一次没有零字节输出文件,并且还有一个包含我想要附加到那里的文本的文件。)

这很好用。

这是我的 Perl 示例 2 的输出:

print() 在 testme3.pl 第 85 行的关闭文件句柄 OUTPUT 上。 示例 2:没有美元符号的 OUTPUT 变量。

和以前一样,当 print 语句无法将输出打印到文件时,它再次显示而不是显示到屏幕上,我收到了第一条错误消息。令我惊讶的是,当文件句柄已经关闭时,我的打印语句正在尝试打印!

在此之前,我没有收到来自操作系统的错误消息,也没有任何 die 消息,因为我没有在 print 语句上放置 die 语句。下面是两个示例代码,以相同的顺序显示产生上述消息的原因。顺便说一句 - 脚本使用了严格;并使用警告;

示例 1:

print "\n\nThis worked fine";
my $OUTPUT;
open ($OUTPUT, '>hereOUTPUT.txt' ) or die "Can not create/open file. $!l";
print $OUTPUT "this is created OUTPUT";
close $OUTPUT;

示例 2:删除打印行上 OUTPUT 的 $ 前缀,上面给出了有趣的新错误消息。

print "\n\nExample 2: with no dollar sign OUTPUT variable.";
my $OUTPUT;
open ($OUTPUT, '>>hereOUTPUT.txt' ) or die "Ex3a) Can not create/open file. $!l";
print OUTPUT "this is non dollar appended OUTPUT";
close $OUTPUT;

最后——这是新的非零输出文件和里面的内容: c:\a000\myperl\projects\dir1>这里的目录* 驱动器 C 中的卷没有标签。 卷序列号为 28B5-6AB9

c:\a000\myperl\projects\dir1的目录

2012 年 12 月 15 日下午 22 点 05:57 此处为OUTPUT.txt 2 个文件 22 字节 0 Dir(s) 636,297,977,856 字节空闲

c:\a000\myperl\projects\dir1>在此处输入OUTPUT.txt 这是创建的 OUTPUT c:\a000\myperl\projects\dir1>

【讨论】:

    【解决方案3】:

    在 Window (Server 2012) 上运行 perl5.24 (Strawberry) 时,我注意到了一个类似的异常,open ...; print $filehandle "something"; close ...; 不起作用:

    以下操作无效(在 open 中使用 my 声明变量):

        open my $fh, '>', "c:/myfile";
    

    以下 DID 工作(在 open 之前声明变量):

        my $fh;
        open $fh, '>', "c:/myfile";
    

    另外奇怪的是,我注意到文件没有改变,直到我close $fh。 关闭文件句柄后,在浏览器中直接改变了文件大小。

    不知道这是什么原因,但希望这个提示可以帮助并节省几个小时的尝试/失败

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-13
      • 2012-03-31
      • 2021-01-19
      • 2020-11-22
      • 2016-09-09
      • 2015-03-05
      相关资源
      最近更新 更多