如果./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) {
#...
}
你可能想CH請返回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);
如果您打印錯誤($!),你可能會得到的什麼是錯的想法... – pilcrow
感謝您指出了這一點。錯誤是'沒有這樣的文件或目錄'。我很驚訝,因爲$舊文件名是準確的。 – Johnathan1
請注意''rename'不享受跨平臺支持,而'File :: Copy'的'move'功能確實是 – Zaid