Perl:重命名目录中的所有文件

时间:2014-09-14 10:38:02

标签: arrays perl rename

所以我是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“需要显式包名”

注意:如果我在行之后注释掉所有内容,程序将无法编译,我显然只会收到错误。

2 个答案:

答案 0 :(得分:2)

  1. 否。不过,您可能需要先chomp($directoryPath)删除换行符。并删除单引号,因为它们不允许插值。你永远不需要引用这样的单个变量。
  2. File应为"File"。否则它就是一个赤字。
  3. j应为$ji
  4. 应相同
  5. 您必须使用my @files声明,就像使用其他变量一样。
  6. 您还应该知道+不是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)

  1. chdir('$directoryPath')更改为chdir("$directoryPath")(解释变量的双引号)并在
  2. 之前将其扼杀
  3. File - &gt; "File"
  4. i - &gt; $i
  5. 声明my @files