2017-04-04 107 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這兩個值,並且該文件將從999511.RPTA123987_2-999511.RPT改名(我還需要添加-這兩個值之間)。

現在我們正在做一個Line_Count,因爲這個RPT總是相同的,但我認爲必須有一個更簡單的方法來搜索和提取這兩個值。任何幫助深表感謝。謝謝。

回答

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%extracted = map {chomp; split/\ s *:\ s * /} <>' – Borodin

相關問題