2017-04-04 8 views
0

私はPerlを初めて使い、修正しようとしているコードを持っています。それは、txtファイルを開き、シリアル番号を探し、そのファイルの名前をシリアル番号の値で変更します。私はまた、部品情報をつかんで、シリアル番号にその情報を追加しようとしています。ファイル名を作成するために別々の行を分割します

ファイルは次のようになります。それから、今

999511.RPT 
C:\users\name\test 
Program Name  : Automation123 
Part Number  : A123987_2 
Board #   : 1 
Serial #   : 999511 
Machine #   : AX-976 
Operator #  : 98512 

を、私はファイルを通過し、パーツ番号およびシリアル番号を引くと、ファイルの名前を変更したいです。

だから私は、開いているファイルをループ、splitを使用して、これらの2つの値をつかみ、そしてファイルが(私も、これらの2つの値の間-を追加する必要があります)A123987_2-999511.RPT999511.RPTから改名されることになるでしょう。

このRPTは常に同じなので、今はLine_Countを行っていますが、これらの2つの値を検索して抽出する簡単な方法があるはずです。どんな助けも大歓迎です。ありがとう。

答えて

2

あなたは値を抽出するためにグループ化して、キーと一致する正規表現を使用することができます。

#! /usr/bin/perl 
use warnings; 
use strict; 

my %extracted; 
while (<>) { 
    if (my ($key, $value) = /^(Serial #|Part Number)\s*:\s*(.*)/) { 
     $extracted{$key} = $value; 
    } 
} 

rename $ARGV, 
    $extracted{'Part Number'} . '-' . $extracted{'Serial #'} . '.RPT' 
    or die $!; 

一度に複数のファイルを処理したい場合は、各ファイルの終わりを検出するために、eofを使用することができます。

#! /usr/bin/perl 
use warnings; 
use strict; 

my %extracted; 
while (<>) { 
    if (my ($key, $value) = /^(Serial #|Part Number)\s*:\s*(.*)/) { 
     $extracted{$key} = $value; 
    } 
    if (eof) { 
     rename $ARGV, 
      $extracted{'Part Number'} . '-' . $extracted{'Serial #'} . '.RPT' 
      or die $!; 
     undef %extracted; 
    } 
} 
+0

ファイル全体をハッシュに読み込むだけでもかまいません。 'my%が抽出されました= map {chomp; split/\ s *:\ s * /} <> ' – Borodin

関連する問題