Perl + печать в file_out вместо стандартного вывода - PullRequest
0 голосов
/ 21 июля 2010

У меня есть следующий скрипт

#!/usr/bin/perl 
open IN, "/tmp/file"; 
s/(.*)=/$k{$1}++;"$1$k{$1}="/e and print while <IN>; 

как напечатать вывод скрипта в file_out для печати на стандартный вывод?

Lidia

Ответы [ 2 ]

0 голосов
/ 21 июля 2010
#!/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;
}
0 голосов
/ 21 июля 2010

Просто добавьте дескриптор файла, в который вы печатаете, после оператора print; открытие для записи - это небольшое изменение по сравнению с открытием для чтения:

#!/usr/bin/perl -w
open IN, "/tmp/file";
open OUT, '>', "/tmp/file_out";
s/(.*)=/Sk_$1_++;"$1Sk_$1_="/ and print OUT while <IN>;

(Я немного проделал замену, поэтому мне было проще тестировать.)

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