有时,我对APL的熟悉程度为我提供了解决问题的算法思路,例如,我使用自己拥有的语言(例如Perl)重新实现。
因此,我已经处理了一个文本文件以创建一个 bool(boolean) vector ,该 vector 指示分隔文件中的已使用字段,现在我想输出这些已使用字段的索引以及已使用字段的名称。在APL中,我将在字段名称的 vector 以及字段数量的iota上使用compress运算符。
在Perl中,我这样做:
my @UsedFieldNames = map { $UsedFields[$_] ? $FieldNames[$_] : () } 0 .. $#UsedFields;
和
say join " ", map { $UsedFields[$_] ? $) : () } 0 .. $#UsedFields;
其中
@UsedFields
是一个数组,其中包含0(未使用)和1(已使用)字段。?:()
的 map 来模拟压缩-是否有更好的方法(我的真实程序在模拟垂直或缩小文件时第三次使用)? @UsedFieldNames = @FieldNames[@UsedIndexes];
最佳答案
其他方法:
my @UsedFieldNames = map { ( $FieldNames[$_] ) x !!$UsedFields[$_] } 0..$#UsedFields;
my @UsedFieldNames = @FieldNames[ grep $UsedFields[$_], 0..$#UsedFields ];