为什么使用 :w 和 :append 时仍会覆盖文件?

9

我拿到了以下代码来尝试文件的打开和写入(不使用spurt):

sub MAIN {
    my $h = open 'somefile.txt', :w, :a;

    for 1..4 {
        $fh.put: "hello";
    }
    $fh.close;
}

我期望的是每次运行都会在文件中追加4行带有“hello”的内容。但是似乎它仍然会覆盖文件,在运行2次或更多次后仍只有4行。
$ perl6 opening.p6
$ cat somefile.txt
hello
hello
hello
hello
$ perl6 opening.p6
$ cat somefile.txt
hello
hello
hello
hello

添加或移除 :a:append 似乎不会影响这种行为,我错过了什么吗?


3
请参见open - LuVa
这基本上是 如何在 Perl 6 中追加文件? 的副本,因此答案基本相同。除非您确切知道自己在做什么并且愿意为潜在的宇宙崩溃负责,正如 Valle 刚刚链接的文档所解释的那样,您应该在任何给定的 open 调用中仅使用 :r:w:a:x:update:rw:ra:rx 中的 一个 模式。您不应将它们组合使用,也不应使用其他模式。 - raiph
@raiph 在使用有问题的模式标志组合时,是否应该发出警告? - Christopher Bottoms
1
@ChristopherBottoms 我无法在一个SO评论的空间内提供我想要提供的微妙细节。(如果你或其他人已经为此打开了一个GH问题,请链接到它,我会在那里适当地发表评论。)过于简化的话...警告可能有道理。但是,如果我考虑这样一件事情,我也会考虑强制使用8个模式只用于自己,并且不能与任何其他模式结合使用,并且如果它们结合起来,则致命。如果人们想要组合,那么他们将不得不使用其他模式。(而且如果在不支持的组合中使用时仍然警告。) - raiph
1个回答

12
根据打开文档,你需要。
my $h = open 'somefile.txt', :a;

一字母和两字母的简写不是修饰符,而是可以单独使用的,:w 可以扩展为

:mode<wo>, :create, :truncate

并且 :a 扩展到

:mode<wo>, :create, :append

模仿POSIX。

你尝试的:w, :append组合实际上应该在追加模式下打开文件,但只有在首先将其截断后才能这样做,这似乎并不特别有用...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接