Как удалить случайное значение из массива в Perl? - PullRequest
2 голосов
/ 25 октября 2009

Я изучаю Perl и создаю приложение, которое получает случайную строку из файла, используя этот код:

open(my $random_name, "<", "out.txt");
my @array = shuffle(<$random_name>);
chomp @array;
close($random_name) or die "Error when trying to close $random_name: $!";
print shift @array;

Но теперь я хочу удалить это случайное имя из файла. Как я могу это сделать?

Ответы [ 3 ]

4 голосов
/ 25 октября 2009
  1. shift уже удаляет имя из массива.

    Так же, как и pop (один в начале, один в конце) - я бы предложил использовать pop, так как он может быть более эффективным и случайным, вам все равно, какой вы используете.

  2. Или вам нужно удалить его из файла?

    Если это так, вам нужно:

    A. получить количество имен внутри файла (если оно маленькое, прочитать все это в памяти, используя File::Slurp, если большое, либо прочитать его построчно и посчитать, либо просто выполнить команду wc -l $filename с помощью обратных кавычек.

    B. Генерация случайного числа от 1 до <$ строк> (скажем, $random_line_number

    C. Читайте файл построчно. Для каждой прочитанной строки ЗАПИШИТЕ ее в другой временный файл (используйте File::Temp для создания временных файлов. За исключением того, что НЕ пишите строку с номером $random_line_number в текстовый файл

    D. Закройте временный файл и переместите его вместо исходного файла

  3. Если список содержит file names и вам необходимо удалить сам файл (случайный файл), используйте функцию unlink(). Не забудьте обработать код возврата из unlink() и, как и при любой операции ввода-вывода, напечатать сообщение об ошибке, содержащее $!, которое будет текстом системной ошибки при сбое.

Готово.

D.

2 голосов
/ 25 октября 2009

Когда вы говорите «удалить это ... из списка», вы имеете в виду удалить его из файла? Если вы просто хотите удалить его из @array, то вы уже сделали это, используя shift. Если вы хотите, чтобы он был удален из файла, и порядок не имеет значения, просто запишите оставшиеся имена в @array обратно в файл. Если порядок файлов имеет значение , вам придется сделать что-то немного более сложное, например, открыть файл, прочитать элементы по порядку, кроме того, который вам не нужен, и затем запишите их снова обратно. Либо так, либо больше обращайте внимание на порядок при чтении файла.

1 голос
/ 25 октября 2009

Если вам нужно удалить строку из файла (это не совсем понятно из вашего вопроса), один из самых простых и эффективных способов - использовать Tie :: File для манипулирования файлом, как если бы он были массивом. В противном случае perlfaq5 объясняет, как это сделать на долгом пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...