有时,我对 APL 的熟悉为我提供了解决问题的算法思想,我用我拥有的语言(例如 Perl)重新实现了这些思想。
所以我已经处理了一个文本文件来创建一个布尔向量,指示分隔文件中使用的字段,现在我想输出那些使用的字段的索引,以及使用的字段的名称。在 APL 中,我会在字段名称向量和字段数量的 iota 上使用 compress 运算符。
在 Perl 中,我这样做了:
my @UsedFieldNames = map { $UsedFields[$_] ? $FieldNames[$_] : () } 0 .. $#UsedFields;
和
say join " ", map { $UsedFields[$_] ? $) : () } 0 .. $#UsedFields;
其中@UsedFields
是一个数组,其中 0 表示未使用,1 表示已使用字段。
我真的不喜欢使用 map with
?:()
来模拟压缩 - 有没有更好的方法(我的真实程序在模拟文件的垂直或缩小时第三次这样做)?我真的不喜欢在索引上绘制地图以获得结果 - 有没有更好的方法来计算它?(我想一个优化是先计算使用的索引,然后
@UsedFieldNames = @FieldNames[@UsedIndexes];