【问题标题】:Why does open with :w and :append still overwrite the file?为什么用 :w 和 :append 打开仍然会覆盖文件?
【发布时间】:2019-10-11 14:51:20
【问题描述】:

我得到以下代码来尝试文件打开和写入(没有冲刺):

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 似乎不会影响这种行为,我错过了什么?

【问题讨论】:

  • 仅使用 :a 另见open
  • 这本质上是How do you append to a file in Perl 6? 的副本,所以答案基本上是一样的。 Aiui,除非您确切地知道自己在做什么并且对可能导致宇宙内爆的事情负责,正如刚刚链接的 Valle 文档中所解释的那样,您应该只使用 8 种模式中的 一种 :r, @ 987654328@、:a:x:update:rw:ra:rx 在任何给定的open 呼叫中。你不应该把它们结合起来。您不应该使用其他模式。
  • @raiph 在使用有问题的模式标志组合时是否应该发出警告?
  • @ChristopherBottoms 我无法用我想在一个 SO 评论空间中提供的细微差别来回答这个问题。 (如果您或其他人已经打开了关于此的 GH 问题,请链接到它,我会在那里正确评论。)过度简化......警告可能是有意义的。但是,如果我要考虑这样的事情,我也会考虑强制这 8 种模式只能单独使用,而不是与任何其他模式结合使用,如果它们结合使用将是致命的。如果人们想要组合,那么他们将不得不使用 other 模式。 (如果在不受支持的组合中使用,它们可能仍会发出警告。)

标签: string file io raku


【解决方案1】:

根据open documentation,你想要

my $h = open 'somefile.txt', :a;

一个和两个字母的速记不是修饰符,但可以单独使用,:w 扩展为

:mode<wo>, :create, :truncate

:a 扩展到

:mode<wo>, :create, :append

模仿 POSIX。

您尝试的:w, :append 组合实际上也应该以附加模式打开文件 - 但只有在先截断它之后,这似乎不是特别有用...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-16
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    • 2012-10-15
    • 1970-01-01
    相关资源
    最近更新 更多