0

次のようなファイルがあります。

[options42BuySide]
logged-check-times=06:01:00
logged-check-address=192.168.3.4
logged-check-reply=192.168.2.5
logged-check-vac-days=sat,sun
start-time=06:01:00
stop-time=19:00:00
falldown=logwrite after 10000
failtolog=logwrite after 10000
listento=all
global-search-text=Target Down. This message is stored;

[stock42BuySide]
logged-check-times=06:01:00
logged-check-address=192.168.2.13
logged-check-reply=192.168.2.54
logged-check-vac-days=sat,sun
start-time=06:01:00
stop-time=18:00:00

このスクリプトは、リストを名前、開始時間、終了時間だけにまで細分化します。

sellSide40, start-time=07:05:00, stop-time=17:59:00
SellSide42, start-time=07:06:00, stop-time=17:29:00
SellSide44, start-time=07:31:00, stop-time=16:55:00
42SellSide, start-time=09:01:00, stop-time=16:59:00

問題は、コマンド ライン パラメータを使用してファイルから特定の名前を除外したいことです。@ARGV 配列を使用して、@nametimes 配列からコマンド ライン値を grep しようとしています。何かのようなもの :

capser@capser$ ./get_start_stop SorosSellSide42 ETFBuySide42

スクリプトはファイルを解析するために正常に動作します - コマンドライン配列に関するヘルプが必要です

#!/usr/bin/perl
use strict ;
use warnings ;

my ($name , $start, $stop, $specific);
my @nametimes; 
my $inifile = "/var/log/Alert.ini";
open ( my $FILE, '<', "$inifile") or die ("could not open the file -- $!");
   while(<$FILE>) {
      chomp ;
      if (/\[(\w+)\]/) {
          $name = $1;

      } elsif (/(start-time=\d+:\d+:\d+)/) {
          $start = $1;

      } elsif  (/(stop-time=\d+:\d+:\d+)/) {
          $stop = $1;
          push (@nametimes, "$name, $start, $stop");
      }
   }

for ($a = 0; $a >= $#ARGV ; $a++) {
$specific = (grep /$ARGV[$a]/, @nametimes) ;
print "$specific\n";
}

おそらくかなり簡単ですが、私は何日もかけて取り組んできましたが、このショップで perl を使用しているのは私だけです。私には誰にも尋ねる人がいませんし、グーグル化も進んでいません。このような簡単な質問をすることで、私に怒鳴るはずの perl の神々を怒らせてしまったことを、あらかじめお詫び申し上げます。

4

3 に答える 3

1

@ARGV をループするための構造は少し扱いに​​くいです。より一般的な方法は次のようになります。

for my $name (@ARGV) {
    #do something
}

しかし、実際には、ループする必要さえありません。それらすべてを 1 つの正規表現に直接結合することができます。

my $names = join("|", @ARGV);
my @matches = grep { /\b($names)\b/ } @nametimes;

ここでは正規表現で \b を使用しました。これは単語の境界を示しているため、引数 SellSide4 は SellSide42 と一致しません。それはあなたが望むものかもしれませんし、そうでないかもしれません...

于 2013-09-11T16:08:42.177 に答える
1

からの結果を格納するgrep()には、スカラーではなく配列を使用します。割り当てるのではなく、プッシュします。そうしないと、forループの 2 回目の繰り返しで結果が上書きされます。何かのようなもの:

for my $el ( @ARGV ) { 
    push @specific, grep { /$el/ } @nametimes); 
};
print join "\n", @specific;
于 2013-09-11T13:56:28.683 に答える