命令行中的 Perl 表达式 - 重命名文件

Perl expressions in command line - renaming files

谁能解释 our 的发生?

ls -1 | grep .ppm | xargs rename -n 's/.*/our $i; if(!$i) { $i=1; } sprintf("%03d.jpg", $i++)/e'

我尝试更改 our 任何其他内容,(opti,此处),

ls -1 | grep .ppm | xargs rename -n 's/.*/opti $i; if(!$i) { $i=1; } sprintf("%03d.jpg", $i++)/e'

抛出以下错误:

 Global symbol "$i" requires explicit package name at (user-supplied code).

看起来它允许您在当前重命名操作的范围内重用全局变量 $i

如果还没有定义(即第一个文件),$i设置为1

用作sprintf 参数的$i++ 意味着对于每个处理的文件,$i 的值都会增加。

有关完整说明,请参阅 our in the perl docs。这里的关键是每个重命名都发生在一个循环中,因此需要 our 来使定义对整个脚本来说是全局的,而不是在循环内局部的。这意味着循环的迭代之间共享相同的变量,因此每次都不会重置计数器。

代码显然是在 use strict; 的范围内编译的。除其他事项外,这会强制声明变量。

变量通常使用 my 声明,使它们成为词法变量。词法变量只存在于声明变量的大括号结束之前,或者直到替换结束 "expression" 在这种情况下。

很少见,变量使用our声明。这使它们成为包变量。即使退出当前词法作用域,它们仍然存在。这允许 $i 在替换表达式调用之间保持其值。


顺便说一句,

s/.*/our $i; if(!$i) { $i=1; } sprintf("%03d.jpg", $i++)/e

可以缩短为

s/.*/our $i; sprintf("%03d.jpg", ++$i)/e

甚至

s/.*/sprintf("%03d.jpg", ++(our $i))/e

甚至

s/.*/sprintf("%03d.jpg", ++$::i)/e