我正在尝试这个以及其他一些东西,但它每次都会截断文件:
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。
答案 0 :(得分:8)
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上截断,我认为这是一个错误。
答案 1 :(得分:3)
使用:mode<wo>, :append
有效但虽然这不是大多数人在看到:a
时要达到的第一件事:
my $file = 'primes.txt';
sub MAIN ( Int:D $low, Int:D $high where * >= $low ) {
unless my $fh = open $file, :mode<wo>, :append {
die "Could not open '$file': {$fh.exception}";
}
for $low .. $high {
$fh.put: $_ if .is-prime;
}
$fh.close;
}
问题是Perl 6倾向于默默地忽略命名参数。它看起来roast/open.t实际上并没有通过用户界面测试这些东西。它扮演的各种技巧应该是不可能的。