Se la directory contenente i file ./emails
:
1.msg
2.msg
3.msg
allora il vostro @files
avrà un aspetto simile ('.', '..', '1.msg', '2.msg', '3.msg')
ma la vostra rename
vuole nomi come 'emails/1.msg'
, 'emails/2.msg'
, ecc Così si può chdir
prima di rinominare:
chdir('emails');
for (@files) {
#...
}
Probabilmente vorrai ch eck anche il valore di ritorno chdir
.
o aggiungere i nomi di directory da soli:
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
Si potrebbe desiderare di combinare la lettura di directory e filtraggio con grep
:
my @files = grep { /^RE .+msg$/ } readdir(DIR);
o anche questo:
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);
fonte
2011-12-09 19:54:51
Se si stampa l'errore ($!) Si potrebbe avere un'idea di ciò che è sbagliato ... – pilcrow
Grazie per la segnalazione. L'errore è "Nessun file o directory". Sono sorpreso perché il vecchio nome del file $ è accurato. – Johnathan1
Si noti che 'rename' non gode del supporto multipiattaforma, mentre la funzione' move' di 'File :: Copia' fa – Zaid