我通过在我的 linux 盒子上设置一个 bcache,把一个快速的sd和一个可观的磁盘结合起来,给自己买了一个矛盾的硬盘。现在我得到了一个硬盘,它的速度非常快,但文件却很小。bcache 通过 sysfs 提供了一些统计数据。要看这些数据,需要读取一些文本文件。一个很适合 slurp
的任务。我最后得到了一堆尖号块,是这样的。
-> $cache {
slurp("/sys/fs/bcache/$cache/cache_available_percent").chomp ~ '%'
}
我把它们和名字放在一起,变成一个 Array,以便能够在它们身上循环。结果发现有两组指针。一组需要 bcache-block 设备的名字,它存放实际的文件系统。另一组得到缓存组的 UUID。我需要将两组的输出进行分组,这样我就得到了。
bcache0:
dirty data: 36.0k
ebc67019-9d50-4042-8080-b173e2ba802f:
hit ratio: 62% 66% 50% 0%
bypassed: 7.0G 2.4G 65.1M 9.1M
cache available: 94%
我本可以把数组拆开,但我想,我可以检查尖号块的签名,而不是选择输出的内容。
for bcache-devs() -> $dev {
with $dev {
say BOLD $dev, ':';
for @stats -> $name, &f {
next unless &f.signature.params».name eq '$dev';
put "\t", $name, ': ', .&f
}
}
}
如果位置参数的名字不符合,我就直接跳过输出。
接下来我试着把 Str
的子集加到位置参数的签名中,来匹配签名。遗憾的是,像这样匹配签名字面量,在这种情况下是行不通的。
subset Dev of Str;
say 'match' if &f.signature ~~ :(Dev $dev);
如果我会定义我的一个类,那肯定能行。看来子集的粗放式匹配是可以如愿的。有点可惜,因为子集的设置非常简单。对于我的例子,只匹配参数名就可以了,因为这样可以节省输入尖号块的时间。
尽管如此,在 Perl 6 中,如果调用者喜欢被调用者的签名,它可以有发言权,这真的很整洁。
by gfldex.