如何在perl中正确排序数组

时间:2014-07-30 14:56:35

标签: arrays perl file sorting rename

如何使用String对数组进行排序,看起来像'name.extension',并且只按名称顺序排序。

我的程序工作错误,然后文件名是0.ext,1.ext,...并且文件的读取顺序错误。

我的计划如下:

#!/usr/bin/perl

use strict;
use warnings;
use File::Basename;

my $args_count = $#ARGV + 1;
if ($args_count != 1) {
    print "Usage: perl.pl dir_path\n";
    exit;
}

my $dir = $ARGV[0];

chdir $dir
    or die "Error - Please check that $dir exists and is accessible.\n";
opendir (DIR, $dir);

my @fileList = readdir DIR;
sort @fileList;
my $count = 0;

print "Old name: |   New name:\n";
foreach (@fileList) {
    next if -d;
        my ($name,$path,$suffix) = fileparse("$_",qr"\.[^.]*$");
        my ($ext) = $_ =~ /(\.[^.]+)$/;

        rename $name.$ext, $count.$ext;

        print "$name$ext    >>   $count$ext\n";
        $count += 1;
}

1 个答案:

答案 0 :(得分:4)

sort将扩展考虑在内可能并不重要,尽管默认情况下sort使用词法排序,以便11.a2.a之前排序1}}。如果您想要数字排序,那么您需要这样说并显示文件名的格式。

的问题在于您对@fileList数组进行排序,然后丢弃已排序的列表。

如果要对数组进行排序,则必须编写

@fileList = sort @fileList

或者如果你只是想按顺序打印它们,你可以在循环中排序,就像这样

foreach (sort @fileList) { ... }

顺便说一句,请不要在本地标识符名称中使用大写字母。它们保留用于Package::Names等全局标识符。你的数组会更好地命名为@file_list