Вот скрипт, который воспроизводит что-то очень похожее на сообщения об ошибках, которые вы видите:
#!/usr/bin/perl
use strict;
use warnings;
my $n1 = "test.pl\n";
`mv $n1 ../out`;
Проблема в том, что $n
заканчивается новой строкой (может быть, вы прочитали ее из файла, а не chomp
это?), Поэтому команда, выполняемая оболочкой, выглядит так:
mv test.pl
../out
Если это действительно проблема, вы могли бы отследить ее, напечатав значение $n1
:
print "DEBUG: \$n1 = \"$n1\"\n";
Обратите внимание, что
`...`
Синтаксис
предназначен для захвата вывода команды оболочки. Поскольку вы просто переименовываете файл, имеет смысл использовать system
:
system 'mv', $n1, '../out';
или, как предложил Квентин в комментарии, использовать File::Copy::move
или встроенную функцию rename
, если вы уверены, что файл не перемещается через границы файловой системы.