1

こんにちは、Mathematica で生成された大きな出力ファイルに 3 つの異なるパターンを探してみました。perlスクリプトで解析したい。これは出力ファイルです:

{{{4,1,2},0,{2,2,2},{4,4,2},{3,5,2},{4,11,0},0,{3,6,2},0,{4,7,2}},{{3,8,2},{1,22,0},   {3,3,2},{1,16,0},{1,9,0},{2,10,0},{3,74,1},{2,18,2},{3,12,0},{2,13,0}},{{1,14,0},0,{2,15,0},0,{1,17,0},0,0,{4,19,1},{4,20,0},{3,30,0}},{{3,38,0},{2,21,0},{1,23,0},{1,24,0},{3,25,0},{1,26,0},{2,27,0},0,{1,28,0},{2,29,0}},{0,{3,32,0},{4,33,0},0,{3,41,0},{3,34,0},{3,36,0},{4,43,0},{4,37,0},{2,31,0}},{{4,46,0},{3,39,0},{1,40,0},{4,49,0},{1,35,0},{3,42,0},{4,44,0},0,0,{4,45,0}},{{2,47,0},0,{1,48,0},{1,57,0},{1,50,0},{1,51,0},{1,60,0},{3,52,0},0,{2,53,0}},{{1,54,0},{2,55,0},0,{1,56,0},{2,58,2},0,{4,59,2},0,{2,68,0},{3,69,0}},{0,{4,62,0},{4,71,2},{1,63,0},{3,64,2},0,{1,65,2},{4,67,0},0,{4,61,2}},{{2,76,2},{2,70,1},0,0,{4,72,2},{4,73,2},0,0,{3,66,2},{1,75,2}}}

入力ファイルに含まれる {\d,\d,0} と {\d,\d,1} および {\d,\d,2} がどれだけあるかを量る必要があります。私のコードはこれです:

#!/usr/bin/perl

use strict;
use warnings;

my $count0 = 0;
my $count1 = 0;
my $count2 = 0;
my $totalcount = 0;

open(MYINPUTFILE, "ultimo.in"); # open for input
my @lines = <MYINPUTFILE>; # read file into list

foreach ($#lines) { # loop thru list
    $count0++ while $lines[0] =~ /\{\d\W\d\W0\}/g;
    $count1++ while $lines[0] =~ /\{\d\W\d\W1\}/g;
    $count2++ while $lines[0] =~ /\{\d\W\d\W2\}/g;
    $totalcount++ while $lines[0] =~ /\{\d\W\d\W\d\}/g;
    }       

print "\n"."Esta es la cuenta de Suceptibles0 es :"."$count0"."\n";
print "\n"."Esta es la cuenta de Infectados1 es :"."$count1"."\n";
print "\n"."Esta es la cuenta de Recuperados2 es :"."$count2"."\n";
print "\n"."El total de agentes en esta grilla es:"."$totalcount"."\n";


close(MYINPUTFILE);

exit;

出力は次のとおりです。

Esta es la cuenta de Suceptibles0 es :1

Esta es la cuenta de Infectados1 es :0

Esta es la cuenta de Recuperados2 es :8

El total de agentes en esta grilla es:9

El total de agentes en esta grilla es:0

El total de agentes en esta grilla es:0

しかし、プログラムは文字列に存在するすべてのパターンをカウントしないため、これは誤った結果です。

これを行うためにプログラムを変更するにはどうすればよいですか?

4

1 に答える 1

3

コードにはいくつかの奇妙な点があります。

  1. おそらく@linesを反復することを意味しているときに、スカラー$#linesを反復しています。ループの内側を書いた方法のため、それは悪影響を及ぼしません。ただし、将来のバージョンで複数行のファイルを処理することが意図されている場合は、そうなります。

  2. 1 桁の数字のみを照合しています。おそらく量指定子、できれば「+」を追加する必要があります

  3. 各グループ内の区切り文字が常にコンマである場合は、単語以外の文字ではなく、特にコンマに一致します。これにより、正規表現が読みやすくなり、効率がわずかに向上します。

これが私が最終的に得たコードです。注: これらの数は確認していません。それはあなたに任せますが、問題 2 があなたの過少報告の主な原因でした。

#!/usr/bin/perl

use strict;
use warnings;

my $count0 = 0;
my $count1 = 0;
my $count2 = 0;
my $totalcount = 0;

open(MYINPUTFILE, "ultimo.in"); # open for input
my @lines = <MYINPUTFILE>; # read file into list

foreach (@lines) { # loop thru list
    $count0++ while $lines[0] =~ /\{\d+,\d+,0\}/g;
    $count1++ while $lines[0] =~ /\{\d+,\d+,1\}/g;
    $count2++ while $lines[0] =~ /\{\d+,\d+,2\}/g;
    $totalcount++ while $lines[0] =~ /\{\d+,\d+,\d\}/g;
    }       

print "\n"."Esta es la cuenta de Suceptibles0 es :"."$count0"."\n";
print "\n"."Esta es la cuenta de Infectados1 es :"."$count1"."\n";
print "\n"."Esta es la cuenta de Recuperados2 es :"."$count2"."\n";
print "\n"."El total de agentes en esta grilla es:"."$totalcount"."\n";


close(MYINPUTFILE);

exit;
于 2012-07-14T22:47:58.537 に答える