2016-10-26 11 views
0

スクリプト内の2つのファイルの内容を比較したいとします。これを行うために、ファイルを配列にロードしています。最初のファイルには、2番目のファイルで検索している固有の名前が含まれています。問題は比較に関連していませんが、結果をファイルに保存する必要があります。名前には配列@unique_namesの値が含まれています。比較後にファイルを作成する行にエラーが表示されます。 $file_name内容の 例:エラーは言う:test.pl線71で無効な引数、ライン6 が、これは全体のスクリプトではありませんだけカットしますのでご注意くださいprint $outputFolder . $ file_namePT_FCT_Sales_20161003.outと結果が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"; 
     } 
    } 
} 

EDITですその問題に関連してオフになります。

+2

問題の説明は完全にわかりません。あなたはどんなエラーを出していますか?また、_please_ '警告を使う;'(と 'use strict;') - それにスカラー '$ unique_names [$ i] 'である_slice_' @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

素晴らしい。私がしたように最初のものを使用しようとすると、作成されたループの数が減ります。 $ fileを 'PT_FCT_Sales * .out'と効果的にマッチさせます。 –

+2

これを' open(my $ OUTFILE、 '>>'、 "$ outputFolder。$ file_name")またはdie ...に変更します。 'open()'の3引数バージョンは、本質的に安全です。 –