2012-02-09 1 views
0

$ outfile、 '>'、$ outpathまたは$ logger-> logdieを開きます( "エラー:$ outpathを開くことができません。 $! ");私は出力が配列(改行で分割)に読み込まれ、次に解析されるコマンドを持っています。 ファイルからスラップしてローカルの$/= "";しかし、私は中間ファイルを持っていることは無駄であり、それを変更したことを読んでいます。今私は次の行を全く読むことができません!ここ を解析する必要が出力されたデータの異なる種類があります:のpWWNが表示されたときに次の行の関連するデータで配列を解析するには

fcalias name DA540_MAE_I0032 vsan 24 
pwwn X0:00:00:63:ab:03:86:e1 

fcalias name NAEMS02_DH6_AUX0 vsan 53 

fcalias name NRTMF02_DM3_BE0 vsan 53 

fcalias name DMSRT56-777_09C0 vsan 53 
interface fc2/33 swwn 20:13:ev:0d:ed:3e:da:00 

、私はそれがデータに応じて、変数「タイプ」=のpWWN/sWWNを/なしで、FCエイリアスに追加します。

はここにあなたが気づいているかもしれないとして当然の

sub fcalias 
    { my ($path, $commandfile, $switch_ip, @data) = @_; 
    my $outpath = "$path${switch_ip}_${commandfile}.csv"; 
    open my $outfile, '>', $outpath or $logger->logdie("Error: Can't open $outpath. It may be open.:$!");  
    my ($type, $fcalias, $vsan); 

    while (@data) 
    { $_ = shift(@data); 
     s/^\s+//;  # Delete leading whitespaces 
     next if (/^$/); # Skip empty lines 

     if (/^fcalias name (\S+) vsan (\S+)/) 
     {($fcalias, $vsan) = ($1, $2);next;} 

     elsif (/^pwwn (\S+)/) 
      {$type = "pwwn"; my $pwwn = $1; 
      print ($outfile, "$fcalias;$vsan;$type;$pwwn;;;$switch_ip\n"); 
      } 

     elsif (/interface (\S+) swwn (\S+)/) 
      {$type = "interface"; 
      my ($interface,$swwn) = ($1,$2); 
      print ($outfile, "$fcalias;$vsan;$type;;$swwn;$interface;$switch_ip\n"); 
      } 

     else {$type = "none"; 
      print ($outfile, "$fcalias;$vsan;$type;;;;$switch_ip\n"); 
      # print "$_ \n"; 
      } 
    } 
    print "..................DONE\n"; 
} 

、私のコードですが、それ以外のdoesntの仕事は、すべて、私はFCエイリアスダブルスを取得します。しかし、私が何をしようと、私は必要な出力を追加することはできません。このサブルーチンは、最適化された大きなスクリプトの一部で、この部分が欠落しています.....ヘルプ!

参考までに、古いコードループをご紹介します。長い投稿とコードの書式を許してください。私は試した。ありがとう!

local $/ = ""; 
while (<DATA>) 
{ if ($_ =~ m/^fcalias name (\S+) vsan (\S+)\s+pwwn (\S+)/) 
    { my ($fcalias, $vsan, $pwwn) = ($1, $2, $3); 
     my $type = "pwwn"; 
     print (OUTFILE "$fcalias;$vsan;$type;$pwwn;;;$switch_ip\n"); 
     } 

    elsif ($_ =~ m/^fcalias name (\S+) vsan (\S+)\s+interface (\S+) swwn (\S+)/) 
     { my ($fcalias, $vsan, $interface, $swwn) = ($1, $2, $3 ,$4); 
     my $type = "interface"; 
     print (OUTFILE "$fcalias;$vsan;$type;;$interface;$swwn;$switch_ip\n"); 
     } 

    else ($_ =~ m/^fcalias name (\S+) vsan (\S+)/) 
     { my ($fcalias, $vsan) = ($1, $2); 
     my $type = "none"; 
     print (OUTFILE "$fcalias;$vsan;$type;;;;$switch_ip\n"); 
     } 
} 
+1

あなたのインデントはひどいです。なぜ自分のために物事を難しくするのですか? – TLP

+0

このページの書式設定に20分かかる。それはそうではありませんでした...最初の投稿、しかし、私は今それを修正したと思う、TABボタンに注意!、笑。 – Comocho00

+0

助けてくれてありがとう。本当に。あなたなしでは、私はこの問題を決して解決することができませんでした。 – Comocho00

答えて

2

タイトルで質問に答えるために、あなたのいずれか

  1. は、次の行に先に見て、またはあなたが読んだとき

  2. は、前の行を読み取った結果をパッチ次の。 else

あなたはそれの半分をコメントアウトしたことを認識して、全くされて動作していませんか?それはOUTFILEに書き込まれませんか? あなたの提供された入力はどれも届きません。空白行をスキップして、他の行と一致しています。^fcaliasと一致するとき(またはデータがなくなったとき)に、elseの本体を実行して、設定した変数がリセットされていないことを確認します。また、これらの変数をpwwnインタフェースのケースでリセットします。

中間ファイルは使用しませんが、古いコードを使用するには、パイプでopenを使用してください。例:

+0

1。私は配列を文字列に変換しようとしていますが、それがどうしたらいいか分かりません。私はそれについて考えなかったとは信じられません... 2.私はそれを知りました。画面に出力して何がループに入っているのかを確認しましたが、値が重複していたので、混乱を減らすために編集しました。 – Comocho00

+0

が試行されました\t \t open(DATA、 "$ data |")またはdie $!; \tローカル$/= ""; \t while() このエラーが発生しました。 sh:1行目:pwwn:コマンドが見つかりません このエラーは150行以上繰り返します。 DATAを使用したくないので、私は配列を使用したいです前の行を読み取った結果。私の問題は、データラインのいくつかが前に何も持っていないということです。 (サンプルデータを参照してください) – Comocho00

+0

@ Comocho00そのコードは[詳細]です(http://perldoc.perl.org/functions/open.html)。あなたは他の場所で、または '$ data'の内容に問題があります。 –

1

データを1行ずつ読み取ると作業が大幅に難しくなるのはなぜですか。 slurpingの問題は、すべてが一度にメモリに終わることです。あなたがファイルが十分小さい場合、これは問題ではありません。

あなたのスタイルにコメントしてください。グローバルファイルハンドル(OUTFILE)は使用しないでください。これらはグローバル変数で、それらに付随するすべての問題があります。たとえば、再帰関数でグローバルファイルハンドルでオープンしている場合。ファイルハンドルを閉じて再度開くことができます。

open my $outfile, '>', $outpath or dieのように、ローカルファイルハンドルを使用する方が効果的です。

+0

これは残りのサブシステムで動作しますが、これが私に問題を引き起こす唯一のものです。私はサブに送信する前に配列にデータを分割するので、代わりに分割されていないデータを送信しようとします.....メモリはあまり問題ではありません。 (ファイルはそれほど大きくありません)、スピードはヒントのおかげで、スクリプトを編集して出力を更新し、明日に試してみます! – Comocho00

+0

送信元の分割データがまったく機能しませんでした。ちょうど初期化されていない値を使用しています。 – Comocho00