Если ваша директория ./emails
содержит следующие файлы:
1.msg
2.msg
3.msg
, тогда ваша @files
будет выглядеть примерно как ('.', '..', '1.msg', '2.msg', '3.msg')
, но ваша rename
хочет иметь имена вроде 'emails/1.msg'
, 'emails/2.msg'
,и т.д. Таким образом, вы можете chdir
перед переименованием:
chdir('emails');
for (@files) {
#...
}
Возможно, вы также захотите проверить возвращаемое значение chdir
.
Или добавьтесами имена каталогов:
rename('emails/' . $old, 'emails/' . $_) or print "Error renaming $old: $!\n";
# or rename("emails/$old", "emails/$_") if you like string interpolation
# or you could use map if you like map
Возможно, вы захотите объединить чтение и фильтрацию каталогов, используя grep
:
my @files = grep { /^RE .+msg$/ } readdir(DIR);
или даже это:
opendir(DIR, 'emails') or die "Cannot open directory";
for (grep { /^RE .+msg$/ } readdir(DIR)) {
(my $new = $_) =~ s/^RE //;
rename("emails/$_", "emails/$new") or print "Error renaming $_ to $new: $!\n";
}
closedir(DIR);