在Perl中显示和传递命令行参数

时间:2012-11-20 16:29:36

标签: perl argv

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

我想要做的是为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"; 
}

1 个答案:

答案 0 :(得分:1)

内置特殊数组@ARGV包含脚本的所有命令行参数,不包括脚本文件本身(以及解释器,如果称为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::LongGetopt::Std模块。这些可以轻松灵活地处理命令行参数。