我有以下程序“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";
}
答案 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::Long
或Getopt::Std
模块。这些可以轻松灵活地处理命令行参数。