首页 > 解决方案 > 如何在 Perl 6 中附加到文件?

问题描述

我正在尝试这个和其他一些事情,但它每次都会截断文件:

my $file = 'primes.txt';
sub MAIN ( Int:D $low, Int:D $high where * >= $low ) {
    unless my $fh = open $file, :w, :append {
        die "Could not open '$file': {$fh.exception}";
    }

    for $low .. $high {
        $fh.put: $_ if .is-prime;
    }
}

将其更改为open $file, :a似乎也会截断文件。这是 macOS 上的 2018.04。

标签: ioraku

解决方案


Perl6&open语义基于POSIX,具有以下映射:

:mode<ro>  --> O_RDONLY
:mode<wo>  --> O_WRONLY
:mode<rw>  --> O_RDWR
:create    --> O_CREAT
:append    --> O_APPEND
:truncate  --> O_TRUNC
:exclusive --> O_EXCL

为方便起见,提供了以下快捷方式:

:r      --> :mode<ro>
:w      --> :mode<wo>, :create, :truncate
:x      --> :mode<wo>, :create, :exclusive
:a      --> :mode<wo>, :create, :append
:update --> :mode<rw>
:rw     --> :mode<rw>, :create
:rx     --> :mode<rw>, :create, :exclusive
:ra     --> :mode<rw>, :create, :append

并非 Rakudo 支持的所有平台(例如 Windows、JVM,甚至不包括 POSIX 本身)都支持所有可能的模式和标志组合,因此只有上述组合才能保证按预期运行(或至少应该按预期运行)。

长话短说,一个简单的:a绝对应该做你想做的事,它在我的 Windows 盒子上也是如此。如果它真的在 MacOS 上截断,我会认为这是一个错误。


推荐阅读