Perl 拆分单独的行以创建文件名

Perl 拆分单独的行以创建文件名,perl,Perl,我对Perl非常陌生,有一段代码正试图修改。它打开一个txt文件并查找序列号,然后用序列号值重命名该文件。我还试图获取零件信息,并将其预先添加到序列号中 这些文件如下所示: 999511.RPT C:\users\name\test Program Name : Automation123 Part Number : A123987_2 Board # : 1 Serial # : 999511 Machine # :

我对Perl非常陌生,有一段代码正试图修改。它打开一个txt文件并查找序列号,然后用序列号值重命名该文件。我还试图获取零件信息,并将其预先添加到序列号中

这些文件如下所示:

999511.RPT
C:\users\name\test
Program Name      : Automation123
Part Number       : A123987_2
Board #           : 1
Serial #          : 999511
Machine #         : AX-976
Operator #        : 98512
现在,我想浏览一下文件,提取零件号和序列号,然后重命名文件

因此,我将在打开的文件中循环,使用
拆分获取这两个值,然后文件将从
999511.RPT
重命名为
A123987_2-999511.RPT
(我还需要在这两个值之间添加
-


现在我们正在进行行计数,因为这个RPT总是相同的,但我认为必须有一种更简单的方法来搜索和提取这两个值。非常感谢您的帮助。谢谢。

您可以使用正则表达式匹配键,并通过分组提取值:

#! /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 $!;
#/usr/bin/perl
使用警告;
严格使用;
我的%提取;
而(){
如果(my($key,$value)=/^(序列号#|零件号)\s*:\s*(*)/){
$extracted{$key}=$value;
}
}
重命名$ARGV,
$extracted{'Part Number'}.-'$提取{'Serial}'。RPT'
或者死美元!;
如果要同时处理多个文件,可以使用检测每个文件的结尾:

#! /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;
    }
}
#/usr/bin/perl
使用警告;
严格使用;
我的%提取;
而(){
如果(my($key,$value)=/^(序列号#|零件号)\s*:\s*(*)/){
$extracted{$key}=$value;
}
如果(eof){
重命名$ARGV,
$extracted{'Part Number'}.-'.$extracted{'Serial}.'.RPT'
或者死美元!;
未定义%提取;
}
}

您可以使用正则表达式匹配键,通过分组提取值:

#! /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 $!;
#/usr/bin/perl
使用警告;
严格使用;
我的%提取;
而(){
如果(my($key,$value)=/^(序列号#|零件号)\s*:\s*(*)/){
$extracted{$key}=$value;
}
}
重命名$ARGV,
$extracted{'Part Number'}.-'$提取{'Serial}'。RPT'
或者死美元!;
如果要同时处理多个文件,可以使用检测每个文件的结尾:

#! /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;
    }
}
#/usr/bin/perl
使用警告;
严格使用;
我的%提取;
而(){
如果(my($key,$value)=/^(序列号#|零件号)\s*:\s*(*)/){
$extracted{$key}=$value;
}
如果(eof){
重命名$ARGV,
$extracted{'Part Number'}.-'.$extracted{'Serial}.'.RPT'
或者死美元!;
未定义%提取;
}
}

您也可以将整个文件读入散列
my%extracted=map{chomp;split/\s*:\s*/}
您也可以将整个文件读入散列
my%extracted=map{chomp;split/\s*:\s*/}