🎄 18/25. 使用 Perl 6 重命名文件

欢迎来到Perl 6 One-Liner Advent Calendar的18天!今天,将会有一个真正的单行程序,在某种意义上说,你要作为一个运维从终端中运行它。

我们的任务是重命名命令行参数中传递的所有文件,并以偏爱的格式提供文件序列号。以下是命令行的示例:

1
$ perl6 rename.pl * .jpg img_0000.jpg

在此示例中,当前目录中的所有图像文件将重命名为img_0001.jpg,img_0002.jpg等。

这是 Perl 6 中可能的解决方案:

1
@*ARGS[0..*-2].sort.map: *.Str.IO.rename(++@*ARGS[*-1])

预定义的动态变量@*ARGS包含命令行中的参数。在上面的示例中,shell 将 *.jpg 掩码展开到文件列表中,因此数组中包含所有这些掩码。最后一个元素是重命名样本 img_0000.jpg。

请注意,与 Perl 5 不同,该变量称为 ARGS,而不是 ARGV。

为了遍历所有文件(并使用文件掩码跳过最后一个文件项),我们正在进行@*ARGS的切片。0..*-2 结构创建了索引范围以接收除了最后一个元素的所有元素。

然后对列表进行排序(原始的@*ARGS数组保持不变),我们使用map 方法迭代文件名 。

map 主体包含一个WhateveCode块 ; 它接受当前值的字符串表示形式,从中生成一个IO::Path对象,并调用 rename 方法。请注意,IO方法创建IO::Path类的对象; 而裸 IO是Perl 6对象系统层次结构中的一个角色

最后,增量运算符++更改重命名样本(保存在@*ARGS 中的最后一个, 即 *-1 元素)。当操作符应用于字符串时,它会增加的数字部分,因此我们得到 img_0001.jpg,img_0002.jpg等。

我希望 Perl 6 不会被称为 star-noise 语言 🙂 。尽管如此,明天还会有另一篇关于 Perl 6 的短篇小文!