如何在 perl6 中过滤自己的输出?
How to filter own output in perl6?
我想过滤自己的输出而无需为此编写单独的程序。有可能适用的 perl5 解决方案。有没有像新语言支持的那样可以做的更好的事情?
head(100);
while (<>) {
print;
}
sub head {
my $lines = shift || 20;
return if $pid = open(STDOUT, "|-");
die "cannot fork: $!" unless defined $pid;
while (<STDIN>) {
print;
last unless --$lines ;
}
exit;
}
@raiph 评论对我帮助很大
可以用任何需要的东西代替 OUT class。这保留了 IO::Capture::Simple 似乎还没有的惰性。
这个例子剪掉了非常简单的重复行
my $undecorated_out = $*OUT;
my $decorated_out = class {
my @previous="nothing";
method print(*@args) {
my @toprint;
if @args[0] eq @previous[0] {
@toprint = ("...\n")
}else{
@toprint = @args;
}
$undecorated_out.print(@toprint) ;
@previous = @args unless @args[0] eq "\n";
}
method flush {}
}
$*OUT = $decorated_out;
我想过滤自己的输出而无需为此编写单独的程序。有可能适用的 perl5 解决方案。有没有像新语言支持的那样可以做的更好的事情?
head(100);
while (<>) {
print;
}
sub head {
my $lines = shift || 20;
return if $pid = open(STDOUT, "|-");
die "cannot fork: $!" unless defined $pid;
while (<STDIN>) {
print;
last unless --$lines ;
}
exit;
}
@raiph 评论对我帮助很大
可以用任何需要的东西代替 OUT class。这保留了 IO::Capture::Simple 似乎还没有的惰性。
这个例子剪掉了非常简单的重复行
my $undecorated_out = $*OUT;
my $decorated_out = class {
my @previous="nothing";
method print(*@args) {
my @toprint;
if @args[0] eq @previous[0] {
@toprint = ("...\n")
}else{
@toprint = @args;
}
$undecorated_out.print(@toprint) ;
@previous = @args unless @args[0] eq "\n";
}
method flush {}
}
$*OUT = $decorated_out;