Как перетасовать строки внутри файла, используя Perl Script - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть текстовый файл, и я хочу перетасовать строки, используя Perl Script.Я сохранил весь файл в массиве и использовал shuffle в util, и я хочу записать эти перемешанные данные в другой файл и переименовать его в старое имя файла.

Я написал фрагмент кода:

use List::Util qw(shuffle);
my @lines;
my @reordered;
my $filepath1 ="C:/Users/SravanthiBekkam/Desktop/pearl/data.txt";
my $filepath2 ="C:/Users/SravanthiBekkam/Desktop/pearl/temp.txt";
my $fhandle; 
my $handle;
open ( $fhandle, "<", $filepath);

while (<$fhandle>) {

    push(  @lines, $_);
}
@reordered = shuffle(@lines);
open ( $handle, ">", $filepath2);
foreach  (@reordered) {
    print $handle  "$_\n";
}
close $fhandle;
close $handle;
unlink $fhandle;
rename($handle, $fhandle);

В приведенном выше коде я сохранил файл в массиве @lines, перетасовал массив и переписал в другой файл, удаляю предыдущий файл и переименовываю добавленный файл в исходный файл.

Предполагается перетасовать строки в одном и том же файле или, по крайней мере, записать в другой.

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Это отличный пример программы, которая становится намного короче, если вы а) используете больше идиом Perlish и б) используете перенаправление ввода / вывода, чтобы избавиться от всего, что открывает и читает файлы.

use List::Util qw(shuffle);

print shuffle <>;

Это читает файл из STDIN и записывает перемешанную версию в STDOUT.Итак, если бы он был в файле с именем shuffle_file, вы могли бы назвать его так:

$ shuffle_file < data.txt > temp.txt

Конечно, вам нужно было бы затем сделать переименование самостоятельно.Но это кажется небольшой ценой за то, что вам не нужно писать весь этот утомительный дополнительный код: -)

О, и я думаю, что проблема с вашим исходным кодом заключается в том, что вы звоните rename(), передавая его закрытымфайловые дескрипторы - когда для этого требуются имена файлов.

rename($filepath2, $filepath1);

(Кажется, также существует некоторая путаница с именем $filepath1 - иногда вы просто называете его $filepath.)

0 голосов
/ 19 февраля 2019

Вы можете использовать модуль Tie::File.Это позволяет получить доступ к содержимому файла в виде массива.

use List::Util qw(shuffle);
use Tie::File;

tie my @lines, 'Tie::File', "C:/Users/SravanthiBekkam/Desktop/pearl/data.txt";
@lines = shuffle @lines;
untie @lines;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...