1

我有以下程序“Extract.pl”,它打开一个文件,找到包含“警告......”,“信息......”,“禁用......”的行,然后计算并打印值和数量他们。它工作正常。

我想要做的是为 3 个匹配项中的每一个创建命令行参数 - 警告、禁用和信息,然后从命令提示符运行它们中的任何一个。

这是代码:

#!/usr/bin/perl

use strict;
use warnings;

my %warnings = ();
my %infos = ();
my %disablings = ();    

open (my $file, '<', 'Warnings.txt') or die $!;                 

while (my $line = <$file>)  {                       

 if($line =~ /^warning ([a-zA-Z0-9]*):/i) {                     
     ++$warnings{$1};                           
}
 if($line =~ /^disabling ([a-zA-Z0-9]*):/i) {                       
     ++$disablings{$1};                         
}
 if($line =~ /^info ([a-zA-Z0-9]*):/i) {                        
     ++$infos{$1};                          
}
}
       close $file;                                     

       foreach my $w (sort {$warnings{$a} <=> $warnings{$b}} keys %warnings) {      
   print $w . ": " . $warnings{$w} . "\n";                  
}
       foreach my $d (sort {$disablings{$a} <=> $disablings{$b}} keys %disablings) {        
   print $d . ": " . $disablings{$d} . "\n";                    
}

       foreach my $i (sort {$infos{$a} <=> $infos{$b}} keys %infos) {   
       print $i . ": " . $infos{$i} . "\n"; 
}
4

1 回答 1

1

内置的特殊数组@ARGV保存脚本的所有命令行参数,不包括脚本文件本身(以及解释器,如果调用 as perl script.pl)。对于类似的调用perl script.pl foo bar warnings@ARGV将包含值“foo”、“bar”和“warnings”。这是一个普通数组,因此您可以编写类似的内容(假设第一个参数是您的选项之一):

my ($warning, $info, $disabling);
if    ($ARGV[0] =~ /warning/i)   { $warning = 1   }
elsif ($ARGV[0] =~ /info/i)      { $info = 1      }
elsif ($ARGV[0] =~ /disabling/i) { $disabling = 1 }

# [...] (opening the file, starting the main loop etc...)

if ( $warning and $line =~ /^warning ([a-zA-Z0-9]*)/i ) {
    ++$warnings{$1};
}
elsif ( $info and $line =~ /^info ([a-zA-Z0-9]*)/i ) {
    ++$infos{$1};
}
elsif ( $disabling and $line =~ /^disabling ([a-zA-Z0-9]*)/i ) {
    ++$disablings{$1};
}

我在遍历文件的主循环之前为三个条件创建了标志变量,以避免在文件的每一行上进行正则表达式编译。

您也可以使用Getopt::LongorGetopt::Std模块。这些提供了对命令行参数的简单灵活的处理。

于 2012-11-20T18:30:55.273 回答