1

Perl ハッカーの助けが必要です。これは簡単に見えますが、私はそれについて1時間考えていましたが、解決策はありませんでした.

次のようなフラット ファイルまたはログ ファイルがあるとします。

    2013-05-27T19:01:23 [INFO] item_id:1, start at Reader.pm line 23
    2013-05-27T19:01:29 [INFO] item_id:2, pause at Reader.pm line 23
    2013-05-27T19:01:30 [INFO] item_id:1, start at Reader.pm line 23
    2013-05-27T19:01:30 [INFO] item_id:1, start at Reader.pm line 23
    2013-05-27T19:01:30 [INFO] item_id:1, start at Reader.pm line 23
    2013-05-27T19:01:30 [INFO] item_id:1, start at Reader.pm line 23
    2013-05-27T19:01:30 [INFO] item_id:3, start at Reader.pm line 23
    2013-05-27T19:01:30 [INFO] item_id:3, start at Reader.pm line 23
    2013-05-27T19:01:30 [INFO] item_id:3, start at Reader.pm line 23
    2013-05-27T19:01:30 [INFO] item_id:5, start at Reader.pm line 23
    2013-05-27T19:01:30 [INFO] item_id:5, start at Reader.pm line 23
    2013-05-27T19:01:30 [INFO] item_id:5, start at Reader.pm line 23
    2013-05-27T19:01:30 [INFO] item_id:5, start at Reader.pm line 23
    (...)

item_id の最大値 (この場合は 5) を見つけて変数 $found に配置するメソッドを作成する必要があります。最大数であるアプリオリがわからないことに注意してください。したがって、入力として「最大数(つまり、この場合は5)」を入力する必要があるため、grepを使用できません。唯一の入力は、ファイルの場所です。何を指示してるんですか?

4

4 に答える 4

3

ログ ファイルのすべての行を読み取り、正規表現を使用してゲーム ID を取得し、ゲーム ID を最初の ID で初期化し、より大きな ID を取得したらそれを置き換えます。

use strict;
use warnings;

my $location = "file.txt";
open LOGFILE, $location;

my $first_line = 1;
my $max_id;

while (<LOGFILE>) {
    if (/item_id:(\d)+/) {
        if ($first_line) {
            $first_line = 0;
            $max_id = $1;
        } else {
            $max_id = $1 if ($1 > $max_id);
        }
    }
}

my $found = $max_id;
print "$found\n";

close LOGFILE;
于 2013-05-28T01:20:46.197 に答える
3

List::Utilには、最大数を選択する max() 関数があります。

use List::Util qw(max);

my @ids;
while(my $line = <$fh>) {
    my($id) = $line =~ /item_id:(\d+)/;
    push @ids, $id;
}

print max(@ids);

教育のために、 max は実装するのが非常に簡単な関数です。

sub max {
    my $max;
    for my $num (@_) {
        $max = $num if $num > $max;
    }

    return $max;
}

行数が非常に多い場合は、ループ内で最大計算を実行して、リストを保存する必要がないようにすることができます。

my $max;
while(my $line = <$fh>) {
    my($id) = $line =~ /item_id:(\d+)/;
    $max = $id if $id > $max;
}
于 2013-05-28T01:21:25.573 に答える