2016-04-13 37 views
0

Bir cmd'nin çıktısını çıktıya bir desen için grep yazmaya çalışıyorum ve eğer varsa bir diziye itin. Ben bir dosyaya çıktı yazılı sorunla karşı karşıya amYazma ve okuma için Perl dosya işleyicisi

dosya işleyicisi kullanımı olmadan, diziler sonra bir dosya işleyicisi içinde aynı kodu yerleştirirseniz, ince ve baskılar çıktı üretmesi

my $output = `cmd to get output`; 
print "output is : $output\n"; 

çalışır Ama Kanunu altında onun bile kod bile alıyorum hayranlarıyla çıkış sadece $VAR1 = [];

olduğunu uyarıları atma değil output is :

use warnings; 
use strict; 
use Data::Dumper; 

foreach my $cfg_file (@cfg_files){ 
#open the file handler for both read and write mode 
    open my $fh1, '+>', 'c:\TEMP\cfg.txt' or die $!; 
    while (<$fh1>) { 
    my $output = `cmd to get output using $cfg_file`; 
    print "output is : $output\n"; 
    print $fh1 $output; #write the output into file 

    if (/$pattern/) { #read the file for a specific pattern 
      print "$_"; 
     push(@matching_lines, $_);   
    } 
    } 
} 
print Dumper(\@matching_lines); 

kodlanmış kelime baskı yapmadığı

+1

Gerçekten de kullanmadığınız @ @ cfg_files' üzerindeki döngüde ne anlama geliyor? Okumak istediğin dosyalar bunlar mı? –

+1

Bir * dosya tanıtıcısı * değil, * dosya tanıtıcısı * denir. Bir şeye tutunmanıza, bir şeyle başa çıkmanıza izin vermez. – ikegami

cevap

2

while (<$fh1>), $fh1 dosya kümesinden okumaya çalışır. Dosyada hiç bir şey yoktu, ilmik gövdesi hiçbir zaman idam edilmedi. Bu arada, +> dosyaya önce göz atıyor, bu yüzden dosya while'a geldiğinde dosya gerçekten boş.

while döngüsünü düşürebilir ve $pattern ürününü yalnızca sahip olduğunuz $output değişkenine karşı test edebilirsiniz. çıkış birden fazla satır olabileceğinden

open my $fh1, '+>', 'c:\TEMP\cfg.txt' or die $!; 

my $output = `cmd to get output`; 
print "output is : $output\n"; 
print $fh1 $output; #write the output into file 

if ($output =~ /($pattern)/s) { # test and capture from output 
    print "$1\n"; 
    push (@matching_lines, $1);   
} 

biz regex için /s ekleyin.

Kodunuzun geri kalanı aynı olurdu.

+0

Mükemmel. Döngüler yaptığım hata oldu. – Jill448

+0

$ cfg_file kullanarak çıktı almak için cmd'de kullanıyorum. Ama şimdi döngüden çıkardıktan sonra hata alıyorum 'desen eşlemesinde başlatılmamış değerin $ _unu kullanıyorum (m //)' Yazmadan sonra ve okumadan önce while döngüsünü tekrar açmam gerekiyor mu? – Jill448

+0

Önerdiğiniz if döngüsündeki değişikliği görmedim. Şimdi hata alıyorum – Jill448