2016-10-26 57 views
0

我想比較腳本中兩個文件的內容。爲了做到這一點,我正在將文件加載到數組中。第一個文件包含我在第二個文件中搜索的唯一名稱。問題與比較無關,但後來我必須將結果保存到文件中,該名稱包含來自@unique_names數組的值。錯誤出現在比較後我創建文件的位置。的$file_name內容 例子:PT_FCT_Sales_20161003.outprint $outputFolder . $ file_name結果是c:\Strawberry\PT_FCT_Sales_20161003.out保存文件時Perl無效參數

foreach my $file (@Files){ 
    if ($file =~ /out$/i){ 
     if ($file =~ /PT_FCT_Sales_/i){ 
      open(my $INFILE, "<", $file) or die $!; 

      @lines = <$INFILE>; 

      foreach (my $i = 0; $i < @unique_names; $i++) { 
       my $file_name = join('', @unique_names[$i]); 
       #print $file_name; 
       my @data; 
       foreach $line (@lines) { 
        if ($line =~ @unique_names[$i]) { 
         push (@data, $line); 
        } 
       } 

       open(my $OUTFILE, ">>", $outputFolder . $file_name) or die $!; #error appears here 
       print $OUTFILE @data; 
       close $OUTFILE; 

      } 
      close $INFILE or die "Can't close input file"; 
     } 
    } 
} 

編輯:錯誤說:在test.pl線71,線路參數無效6. 請注意,這不是整個腳本,只是一個切與問題有關。

+2

問題的描述對我來說完全不清楚。你遇到了什麼錯誤?另外,_please_'使用警告;'(和'use strict;') - 用它來警告_slice_'@unique_names [$ i]',它應該是標量'$ unique_names [$ i]' 。 – zdim

+0

你爲什麼要在if語句中做一個if語句,然後又是你之前做過foreach的同一個數組的foreach?您正在創建不必要的循環。 '$ outputfolder'只使用一次? '@uniquenames [$ i]可以寫成'$ uniquenames [$ I]'@files只能使用一次,腳本的其餘部分在哪裏? –

+0

@zdim我使用'strict'和'warnings',但我忽略了警告。更正後,它仍然不起作用。請閱讀更新到我的文章 – Dodzik

回答

0

這裏是一個稍微好一點的解決方案。未經測試。所以我會一起編輯和修復。請提供$ outputfolder的定義位置。

foreach my $file (@Files){ 
if ($file =~ /^PT_FCT_Sales.*\.out$/i){ 
     open(my $INFILE, "<", $file) or die $!; 
     @lines = <$INFILE>; 
     foreach (my $i = 0; $i < @unique_names; $i++) { 
      my $file_name = join('', $unique_names[$i]); 
      my @data; 
      while (<$INFILE>) { 
       if ($line =~ $unique_names[$i]) { 
        push (@data, $line); 
       } 
      } 
      open(my $OUTFILE, ">> $outputFolder.$file_name") or die $!; #error appears here 
      print $OUTFILE @data; 
      close $OUTFILE; 

      } 
      close $INFILE or die "Can't close input file"; 
     } 
    } 
+1

實際上'「>> $ outputFolder。$ file_name」'解決了我的問題。謝謝! – Dodzik

+2

真棒。試着也使用第一個,如果我這樣做,它會減少創建的循環次數。這將有效地匹配$文件與'PT_FCT_Sales * .out' –

+2

我會改變它'打開(我的$ OUTFILE,'>>',「$ outputFolder。$ file_name」)或死... ...。 open()的三個參數版本本質上更安全。 –