2012-11-20 28 views
1

我有下列程序“Extract.pl”,它打开一个文件,找到包含“警告....”,“信息...”,“禁用..”的行。 。“然后计数并打印它们的值和数量。它工作正常。在Perl中显示并传递命令行参数

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

下面是代码:

#!/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

你忘了问一个问题。你有什么试图读取命令行参数?如何失败?通过一个简单的谷歌搜索,我甚至可以在SO上找到数百万个好阅读,包括'getopt'。 – memowe

+0

是的,我会试试看。我一直在阅读关于命令行参数的很多内容,发现了一些例子,但仍然无法在我的代码中实现它们。我一直在学习编程和perl的最新数据,我只是在寻求帮助。谢谢。 “ – TheBlackCorsair

+0

”从命令提示符运行其中任何一个。“没有意义。要么? – ikegami

回答

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模块。这些提供了对命令行参数的简单和灵活的处理。

+0

谢谢@mpe。这非常有用。它正在工作,我也尝试了Getopt :: Long模块,并且工作得很好。 – TheBlackCorsair

+0

不客气:) – mpe