#!/usr/bin/perl
open IN, "/tmp/file";
open OUT, ">file_out.txt";
s/(.*)=/$k{$1}++;"$1$k{$1}="/e and print OUT while <IN>;
Пояснение:
- `open IN," / tmp / file "
open
команда для открытия файла
IN
имя дескриптора файла
/tmp/file
имя файла и спецификатор, который он предназначен для чтения
- если модификатора нет, это означает чтение
- если есть
<
, т. Е. "</tmp/file"
, это также означает чтение
- `open OUT,"> file_out.txt "
open
команда для открытия файла
OUT
имя дескриптора файла
>file_out.txt
имя файла и спецификатор, который он предназначен для чтения
- должно быть
>
, т. Е. ">file_out.txt"
для записи
s/.../.../e
ваша замена (я полагаю, вы знаете, что она делает)
and
- логический оператор, который замыкает накоротко , что означает, что он делает это только потом, если вещь заранее верна. В этом случае он будет печататься только в том случае, если подстановка действительно соответствует чему-либо.
print OUT
печать в файл-дескриптор OUT
while <IN>
для каждой строки из файла за дескриптором файла IN
Примечание:
Используемый таким образом, он широко использует магическую переменную по умолчанию $_
. Выполните поиск для $_
на сайте perlintro . Короче говоря:
- Если вы не указываете подстановке
s///
, над какой строкой работать, она использует $_
- Если вы не скажете
print
, что печатать, будет напечатано $_
- Если вы не сообщаете циклу
while
, проходящему через данные файлового дескриптора, куда помещать каждую строку, он помещается в $_
Ваша программа могла быть переписана:
#!/usr/bin/perl
open IN, "/tmp/file";
open OUT, ">file_out.txt";
while( defined( $line = <IN> ) )
{
$line =~ s/(.*)=/$k{$1}++;"$1$k{$1}="/e or next;
print OUT $line;
}