如何使用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;
}
答案 0 :(得分:4)
sort
将扩展考虑在内可能并不重要,尽管默认情况下sort
使用词法排序,以便11.a
在2.a
之前排序1}}。如果您想要数字排序,那么您需要这样说并显示文件名的格式。
的问题在于您对@fileList
数组进行排序,然后丢弃已排序的列表。
如果要对数组进行排序,则必须编写
@fileList = sort @fileList
或者如果你只是想按顺序打印它们,你可以在循环中排序,就像这样
foreach (sort @fileList) { ... }
顺便说一句,请不要在本地标识符名称中使用大写字母。它们保留用于Package::Names
等全局标识符。你的数组会更好地命名为@file_list