Это отличный пример программы, которая становится намного короче, если вы а) используете больше идиом Perlish и б) используете перенаправление ввода / вывода, чтобы избавиться от всего, что открывает и читает файлы.
use List::Util qw(shuffle);
print shuffle <>;
Это читает файл из STDIN
и записывает перемешанную версию в STDOUT
.Итак, если бы он был в файле с именем shuffle_file
, вы могли бы назвать его так:
$ shuffle_file < data.txt > temp.txt
Конечно, вам нужно было бы затем сделать переименование самостоятельно.Но это кажется небольшой ценой за то, что вам не нужно писать весь этот утомительный дополнительный код: -)
О, и я думаю, что проблема с вашим исходным кодом заключается в том, что вы звоните rename()
, передавая его закрытымфайловые дескрипторы - когда для этого требуются имена файлов.
rename($filepath2, $filepath1);
(Кажется, также существует некоторая путаница с именем $filepath1
- иногда вы просто называете его $filepath
.)