Jak już wspomniano, twój skrypt kończy się niepowodzeniem ze względu na oczekiwaną ścieżkę i skrypt nie jest taki sam.
Proponuję bardziej przejrzyste użycie. Hardcoding katalogu nie jest dobrym pomysłem, IMO. Jak się nauczyłem pewnego dnia, kiedy zrobiłem scenariusz, aby zmienić oryginalne pliki, z zakodowaną ścieżką, a mój kolega myślał, że to będzie dobry skrypt do pożyczenia, żeby zmienić jego kopie. Ooops!
Zastosowanie:
perl script.pl "^RE " *.msg
to wyrażenie regularne, to lista plików glob, gdzie ścieżka jest oznaczona w stosunku do scenariusza, np *.msg
, emails/*.msg
lub nawet /home/pat/emails/*.msg /home/foo/*.msg
. (wiele globusów możliwych)
Korzystanie z bezwzględnych ścieżek pozostawi użytkownika bez żadnych wątpliwości, do których plików on wpłynie, a także sprawi, że skrypt będzie ponownie używany.
Kod:
use strict;
use warnings;
use v5.10;
use File::Copy qw(move);
my $rx = shift; # e.g. "^RE "
if ($ENV{OS} =~ /^Windows/) { # Patch for Windows' lack of shell globbing
@ARGV = map glob, @ARGV;
}
for (@ARGV) {
if (/$rx/) {
my $new = s/$rx//r; # Using non-destructive substitution
say "Moving $_ to $new ...";
move($_, $new) or die $!;
}
}
W przypadku drukowania błąd ($!) Można zorientować się, co się stało ... – pilcrow
Dziękuję za wskazanie, że obecnie. Błąd to "Brak takiego pliku lub katalogu". Jestem zaskoczony, ponieważ stara nazwa pliku jest dokładna. – Johnathan1
Należy zauważyć, że 'rename' nie korzysta z obsługi wielu platform, natomiast' File :: Copy''s 'move' ma funkcję – Zaid