命令行中的 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
谁能解释 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