命令行中的Perl表达式-重命名文件
有人能解释一下我们的发生的原因吗命令行中的Perl表达式-重命名文件,perl,shell,rename,local-variables,Perl,Shell,Rename,Local Variables,有人能解释一下我们的发生的原因吗 ls -1 | grep .ppm | xargs rename -n 's/.*/our $i; if(!$i) { $i=1; } sprintf("%03d.jpg", $i++)/e' 我试着改变我们的任何其他东西,(opti,这里) 抛出以下错误: Global symbol "$i" requires explicit package name at (user-supplied code). 它似乎允许您在当前重命名操作的范围内重用全局变量$
ls -1 | grep .ppm | xargs rename -n 's/.*/our $i; if(!$i) { $i=1; } sprintf("%03d.jpg", $i++)/e'
我试着改变我们的任何其他东西,(opti
,这里)
抛出以下错误:
Global symbol "$i" requires explicit package name at (user-supplied code).
它似乎允许您在当前重命名操作的范围内重用全局变量
$i
如果尚未定义它(即第一个文件),$i
设置为1
$i++
用作sprintf
的参数意味着对于处理的每个文件,$i
的值都会增加
有关完整说明,请参阅。这里的关键是,每个重命名都发生在一个循环中,因此需要
我们的
使定义在整个脚本中是全局的,而不是在循环中是局部的。这意味着在循环的迭代之间共享相同的变量,因此计数器不会每次都重置。看起来它允许您在当前重命名操作的范围内重用全局变量$i
如果尚未定义它(即第一个文件),$i
设置为1
$i++
用作sprintf
的参数意味着对于处理的每个文件,$i
的值都会增加
有关完整说明,请参阅。这里的关键是,每个重命名都发生在一个循环中,因此需要
我们的
使定义在整个脚本中是全局的,而不是在循环中是局部的。这意味着在循环的迭代之间共享相同的变量,因此计数器不会每次都重置。代码显然是在use strict的范围内编译的代码>。除其他事项外,这将强制执行变量声明
变量通常使用my
声明,使其成为词汇变量。词法变量只存在到声明变量的花括号的末尾,或者在本例中直到替换“表达式”的末尾
很少使用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
甚至
s/.*/sprintf("%03d.jpg", ++(our $i))/e
s/.*/sprintf("%03d.jpg", ++$::i)/e
代码显然是在use strict的范围内编译的代码>。除其他事项外,这将强制执行变量声明
变量通常使用my
声明,使其成为词汇变量。词法变量只存在到声明变量的花括号的末尾,或者在本例中直到替换“表达式”的末尾
很少使用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
甚至
s/.*/sprintf("%03d.jpg", ++(our $i))/e
s/.*/sprintf("%03d.jpg", ++$::i)/e