2015-08-06 5 views
-7

Я работаю над скриптом perl, который должен выводить информацию в командную строку, но я хотел бы иметь возможность создавать файл и печатать на нем информацию. В основном я хочу заменить оператор печати на другой оператор, который будет записывать и хранить информацию в файле.Как распечатать файл в Perl?

foreach(my $i=0; $i < scalar(@netstat_array); $i++) 
    { 
    if($netstat_array[$i]{"protocol_name"} eq $protocol_name_input) 
     { 
      print $netstat_array[$i]{"protocol_name"}; 
      print ";"; 
      print $netstat_array[$i]{"local_address"}; 
      print ";"; 
      print $netstat_array[$i]{"port_number"}; 
      print ";"; 
      print $netstat_array[$i]{"listening_device"}; 
      print ";"; 
      print $netstat_array[$i]{"process_identifier"}; 
      print ";"; 
      print $netstat_array[$i]{"process_name"}; 
      print "\n"; 
     } 
    }  

Любая помощь приветствуется.

+3

HTTP: //perldoc.perl.org/perlopentut.html – Quentin

+3

'perl your_script.pl> your_file.txt'? – RobEarl

+1

http://perldoc.perl.org/perlintro.html#Files-and-I/O даже. 'perlintro': 20 минут требуемого чтения. – DavidO

ответ

0

print печатает в дескрипторе файла, который, если не указано явно, по умолчанию является STDOUT.

print "Hello, world!" такое же, как print STDOUT "Hello, world!". Обратите внимание, что между STDOUT и строкой, которая должна быть напечатана, нет запятой (так называемый косвенный синтаксис объекта).

Вы можете создать свой собственный дескриптор файла с помощью open(my $fh, '>', 'output.txt'); и использовать print $fh "Hello, world!" вместо print "Hello, world!".

+3

Пожалуйста, не используйте глобальные дескрипторы файлов. Вместо этого используйте лексический дескриптор файла '$ fh'. – simbabque

+2

Вы также должны всегда проверять наличие ошибки после попытки 'open':' открыть my $ fh, '<', 'filename.txt' или die $ !; 'Replace' die' с 'warn', если вы хотите обрабатывать проблема изящно. – stevieb

3

Три варианта:

  1. печать на новый дескриптор.

    Открыть файл за пределами вашего цикла.

    open my $out_fh, '>', 'your_file_name' or die $!; 
    

    Затем измените все ваши операторы печати, чтобы напечатать новый дескриптор файла.

    print $out_fh $netstat_array[$i]{"protocol_name"}; #etc... 
    
  2. Измените дескриптор файла по умолчанию.

    Откройте дескриптор файла, как в предыдущем примере. Но затем вызовите select, чтобы изменить дескриптор файла, который print использует по умолчанию.

    select $out_fh; 
    

    Таким образом, вам не нужно менять свои print заявления на всех.

  3. Не изменяйте свой код вообще. Используйте функции перенаправления ввода-вывода вашей операционной системы, чтобы перенаправить STDOUT в файл при вызове вашей программы.

    $ ./your_program.pl > your_output_file 
    

Update: Просто подумал о более удобном способе сделать все ваши печати.

my @cols = qw[protocol_name local_address port_number 
       listening_device process_identifier process_name]; 

foreach my $i (0 .. $#netstat_array) { # much easier to understand 
    if($netstat_array[$i]{"protocol_name"} eq $protocol_name_input) { 
    # Hash slices are cool! 
    print join ';', @{$netstat_array[$i]}{@cols}; 
    } 
} 
+0

Есть ли какая-то конкретная причина, по которой вы не используете упорядоченный список, а вместо косой черты? – simbabque

+0

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

+1

Готово. Это просто куча дополнительных пространств. :) – simbabque

-1

используют эту подпрограмму, это простой способ

sub save { 
    my ($file,$item) = @_; 
    open(SAVE,">>".$file); 
    print SAVE $item."\n"; 
    close(SAVE); 
} 

просто использовать save($file_to_save,$text_to_save); в вас Exemple вы можете распечатать $netstat_array[$i]{"protocol_name"} в 1.TXT файл, как это:

save ("1.txt",$netstat_array[$i]{"protocol_name"}); 
+0

Пожалуйста, не используйте дескрипторы дескрипторов. И ** всегда ** проверяйте возвращаемое значение с 'open'. О, и почему предполагается, что пользователь хочет распечатать только один элемент? Почему бы не 'my ($ file, @items) = @ _'? –

Смежные вопросы