Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
命令行中的Perl表达式-重命名文件_Perl_Shell_Rename_Local Variables - Fatal编程技术网

命令行中的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