a Picky Caller

楽土

我通过在我的 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.

comments powered by Disqus