【问题标题】:Perl: Rename all files in a directoryPerl:重命名目录中的所有文件
【发布时间】:2014-11-08 01:19:11
【问题描述】:

所以我是 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:错误消息“使用“严格的子”时不允许使用裸词“文件”

3:与第 2 点相同。但对于“i”和“j”

4:错误消息“全局符号“@files”需要明确的包名称'

注意:如果我注释掉行后的所有内容,我显然只能得到错误一,否则程序将无法编译。

【问题讨论】:

    标签: arrays perl rename


    【解决方案1】:
    1. 没有。不过,您可能需要先 chomp($directoryPath) 删除换行符。并删除单引号,因为它们不允许插值。您永远不需要像这样引用单个变量。
    2. File 应该是 "File"。否则它就是一个空词。
    3. j 应该是 $j,对于 i 也是一样的
    4. 您必须使用my @files 进行声明,就像使用其他变量一样。

    您还应该知道+ 在 Perl 中不是串联运算符。为此,您应该使用.。但是您也可以将其插入双引号字符串中。当引用单个数组元素时,您还应该使用标量符号$,而不是@:

    rename($files[$j], "$fileName$i") or die ...
    

    在readdir之前,您也忘记了opendir。

    您正在使用for 循环,但没有使用迭代器值$_,而是使用您自己的计数器。您正在使用两个计数器,而只需要一个。所以你不妨这样做:

    for my $i (0 .. @files) {   # @files in scalar context returns its size
        rename($files[$i], $fileName . ($i+1)) or die ...
    }
    

    【讨论】:

      【解决方案2】:
      1. 将chdir('$directoryPath') 更改为chdir("$directoryPath")(用于解释变量的双引号)并在此之前将其切掉
      2. File -> "File"
      3. i -> $i
      4. 声明my @files

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-16
        • 2015-02-28
        • 2014-10-09
        • 2012-01-17
        • 1970-01-01
        • 2013-08-20
        • 2014-11-29
        • 1970-01-01
        相关资源
        最近更新 更多