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、スクリプトに対するすべてのコマンドライン引数を保持します。のような呼び出しの場合、値'foo'、'bar'、および'warnings'が含まれます。これは通常の配列なので、次のように記述できます(最初の引数がオプションの1つであると想定)。perl script.plperl script.pl foo bar warnings@ARGV

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};
}

ファイルのすべての行で正規表現のコンパイルを回避するために、ファイルを通過するメインループの前に3つの条件のフラグ変数を作成しました。

Getopt::LongまたはGetopt::Stdモジュールを使用することもできます。これらは、コマンドライン引数の簡単で柔軟な処理を提供します。

于 2012-11-20T18:30:55.273 に答える