2013-08-21 24 views
1

Perl新手和我的限制令人沮喪。任何幫助是極大的讚賞。文本模式匹配的打印輸出

創建腳本將:

  1. 輸入一個文件並解析測試圖案匹配
  2. 輸出的特定匹配的單詞到可變
  3. 運行外部窗口程序(NSLOOKUP)針對變量,
  4. NSLOOKUP的解析輸出爲測試模式匹配
  5. 輸出的特定匹配的單詞到可變
  6. 兩個變量之間進行置換
  7. 然後輸出修改後的文本到一個文件

呼應「這是一臺機器:ford.com測試」到input.txt的文件

我」在做一些錯誤的打印輸出,因爲我不斷收到在test21.pl線在無效的情況下以下

沒用使用字符串的38
非權威的答案:使用0未初始化值$ _在打印的test21.pl線39

#!/bin/perl 
use strict; 
use warnings; 
use Net::Nslookup; 
use File::Copy; 

sub host { 
    my $result; 
    my $node = shift; 
    print system("nslookup $node.com | findstr ^Name: >> POOH"); 
    open(my $stuff, "<", "POOH") || die "Can't open input.txt: $!"; 
    while (<$stuff>) { 
     if (/(Name:)(\s+)(\w+)/) { 
      $result = $3; 
     } 
    } 
    return $result; 
} 

my $captured; 
my $captured2; 
my $jeff; 
my $in = 'input.txt'; 
my $out = 'output.txt'; 
my $test = 'test.txt'; 

copy($in, $out) || die "File cannot be copied."; 
open OUTPUT, "< $out" || die "Can't open input.txt: $!"; 
open TEST, "> $test" || die "Can't open input.txt: $!"; 

while (<OUTPUT>) { # assigns each line in turn to $_ 
    if (/(Machine:)(\s)(\w+)/) { 
     $captured = $3; 
     $jeff  = host($captured); 
    } 

    "s/$captured/$jeff/g"; 
    print TEST; 

} 
+2

我對Perl沒有太多瞭解,但問題似乎是第二條線。如果你只是刪除替代運算符的引號會怎麼樣? –

+0

我認爲m.buettner是正確的。在第38行,它應該是's/$ captured/$ jeff/g;'。當你把引號放在它上面時,你正在製作一個字符串。它說你在無效環境中使用它,因爲你沒有對字符串做任何事情。 – chilemagic

回答

0

你不需要引號圍繞 「S/$捕獲/ $傑夫/ G」。對於第二個問題,我會更清楚地知道我打印到文件處理程序的內容。例如打印測試$ _

0

感謝大家的建議。找到了一些代碼,它指示我在使用while循環輸入一行代碼後將缺省標量變量保存到變量中。這樣做可以節省我很多雜亂的編碼。這是功能代碼。

#!E:/Perl/bin/perl 
use strict; 
use warnings; 

sub host { 
    my $result; 
    my $node = shift; 
    print system("nslookup $node.com | findstr ^Name: >> LOOKUP"); 
    open(my $stuff, "<", "LOOKUP") || die "Can't open input.txt: $!"; 
    while (<$stuff>) { 
     if (/(Name:)(\s+)(\w+)/) { 
     $result = $3; 
     } 
    } 
    return $result; 
} 

my $captured; 
my $jeff; 


open INPUT, '<', 'input.txt' || die "Can't open input.txt: $!"; 
open OUTPUT, '>', 'output.txt' || die "Can't open input.txt: $!"; 

while (<INPUT>) {  # while loop inputs each line of input.txt file 
    my($line) = $_; 
    if (/(Machine:)(\s)(\w+)/){ 
    $captured = $3; 
    $jeff = host($captured); 
    $_ = $line; 
    $line =~ s/$captured/$jeff/g; 
    print OUTPUT $line; 
    } 
} 

close OUTPUT; 
close INPUT;