所以我是Perl的新手,这是我的第一个程序(不包括几个基本的教程,可以掌握非常基本的语法)
我想要做的是将指定目录中的所有文件重命名为“文件1”,“文件2”,“文件3”等
这是我到目前为止的代码:
use 5.16.3;
use strict;
print "Enter Directory: ";
my $directoryPath = <>;
chdir('$directoryPath') or die "Cant chdir to $directoryPath$!";
@files = readdir(DIR); #Array of file names
closedir(DIR);
my $i = 1; #counting integer for file names
my $j = 0; #counting integer for array values
my $fileName = File;
for (@files)
{
rename (@files[j], $fileName + i) or die "Cant rename file @files[j]$!";
i++;
j++;
}
chdir; #return to home directory
我有很多问题:
1:每当我尝试更改目录时,我都会收到“或死”消息。我想知道这是否与我开始的工作目录有关,在遍历不同的目录路径之前,我是否需要通过执行类似“.. \”的操作来访问C:目录?
2:错误消息'Bareword'文件“不允许”严格的子“在使用中”
3:与第2点相同,但对于“i”和“j”
4:错误消息“全局符号”@files“需要显式包名”
注意:如果我在行之后注释掉所有内容,程序将无法编译,我显然只会收到错误。
答案 0 :(得分:2)
chomp($directoryPath)
删除换行符。并删除单引号,因为它们不允许插值。你永远不需要引用这样的单个变量。File
应为"File"
。否则它就是一个赤字。j
应为$j
,i
my @files
声明,就像使用其他变量一样。您还应该知道+
不是Perl中的串联运算符。您应该使用.
来实现此目的。但你也可以用双引号字符串插入它。在引用单个数组元素时,您还应该使用标量符号$
,而不是@
:
rename($files[$j], "$fileName$i") or die ...
您在opendir
之前忘记了readdir
。
您正在使用for
循环,但不使用迭代器值$_
,而是使用您自己的计数器。您使用两个计数器,只需要一个。所以你不妨这样做:
for my $i (0 .. @files) { # @files in scalar context returns its size
rename($files[$i], $fileName . ($i+1)) or die ...
}
答案 1 :(得分:0)
chdir('$directoryPath')
更改为chdir("$directoryPath")
(解释变量的双引号)并在File
- &gt; "File"
i
- &gt; $i
my @files