Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl-通过两个因素查找文件中的最高值_Perl - Fatal编程技术网

Perl-通过两个因素查找文件中的最高值

Perl-通过两个因素查找文件中的最高值,perl,Perl,我有一个文件,我需要把它读入Perl,用我的名字和出生年份找到所有的出生总数,然后用我的名字和年份找到出生人数最高和最低的州。我可以做第一部分,但我完全迷失了,当我试图找到最高和最低的国家,由年和月。我该如何匹配和跟踪这些信息? 以下是我目前掌握的代码: use 5.13.0; use warnings; use strict; my $file; my $line; my $count = 0; my $total; my $name; my $year, my $gender; my $s

我有一个文件,我需要把它读入Perl,用我的名字和出生年份找到所有的出生总数,然后用我的名字和年份找到出生人数最高和最低的州。我可以做第一部分,但我完全迷失了,当我试图找到最高和最低的国家,由年和月。我该如何匹配和跟踪这些信息? 以下是我目前掌握的代码:

use 5.13.0;
use warnings;
use strict;

my $file;
my $line;
my $count = 0;
my $total;
my $name;
my $year, my $gender;
my $state;

$file = "StateNames.csv";

open( FILE, "$file" );
while ( $line = <FILE> ) {
   if ( $line =~ /Paul,1982/ ) {
      ( $line, $name, $year, $gender, $state, $total ) = split /,/, $line;
      $count = $count + $total;
   }
}

if ( $count == 0 ) {
   print
     "There were no people named Paul found.        Please       try again.";
}

print "The total number of people named Paul born in 1982 is $count";
print $state $total;

您希望将数据放入多个哈希中。这将是一个开始:

my %parsedInfo;

my @info;
my $i = 1;
while (defined (my $line = <DATA>)) {
    my ($lineNumber, $name, $year, $gender, $state, $total)
        = @info = split /\s+/, $line;
    push @{$parsedInfo{$name}{$year}{$state}}, [@info];
}
foreach my $name (sort keys %parsedInfo) {
    my $yearRef = $parsedInfo{$name};
    foreach my $year (sort {$a <=> $b} keys %$yearRef) {
        my $stateRef = $yearRef->{$year};
        foreach my $state (sort keys %$stateRef) {
            print "$name=>$year=>$state ==========\n";
            for my $infoRef (@{$parsedInfo{$name}{$year}{$state}}) {
                print join(':', @$infoRef), "\n";
            }
        }
    }
}
这将创建一个对名称进行键控的哈希,该名称包含一个对年份进行键控的哈希,该年份包含一个对包含该条目数据的州进行键控的哈希

一旦你把它放入适当的散列中,你就可以做任何你想做的事情。将其放入调试器中,并逐步执行,以便更好地理解。没有更好的数据,我做不了更多

希望这有助于。。。
Steve S.

数据保存在CSV文件中,格式如下所示。我需要按姓名和年份找到该州最高的出生人数406738皮拉尔1964 F CA 8 406739派珀1964 F CA 8 406740 Raelynn 1964 F CA 8 406741 Rafaela 1964 F CA 8 406742 Reba 1964 F CA 8 406743 Risa 1964 F CA 8 406744 Robbi 1964 F CA 8 406745 Rolanda 1964 F CA 8:数据库将是一个不错的选择。散列是另一个选项。
/…/
位是一个,具有特定的使用规则。您想要
/Paul\s+1982/
,或者更确切地说是使用变量
/$n\s+\$y/
(尽管选择更好的名称)。这将匹配具有
Paul
后跟至少一个“空格”(包含选项卡)和
1982
的行。也许您需要定义一些变量来保存最低和最高的数字和状态,并在循环中使用它们。
my %parsedInfo;

my @info;
my $i = 1;
while (defined (my $line = <DATA>)) {
    my ($lineNumber, $name, $year, $gender, $state, $total)
        = @info = split /\s+/, $line;
    push @{$parsedInfo{$name}{$year}{$state}}, [@info];
}
foreach my $name (sort keys %parsedInfo) {
    my $yearRef = $parsedInfo{$name};
    foreach my $year (sort {$a <=> $b} keys %$yearRef) {
        my $stateRef = $yearRef->{$year};
        foreach my $state (sort keys %$stateRef) {
            print "$name=>$year=>$state ==========\n";
            for my $infoRef (@{$parsedInfo{$name}{$year}{$state}}) {
                print join(':', @$infoRef), "\n";
            }
        }
    }
}
Pilar=>1964=>CA ==========
406738:Pilar:1964:F:CA:8
Piper=>1964=>CA ==========
406739:Piper:1964:F:CA:8
Raelynn=>1964=>CA ==========
406740:Raelynn:1964:F:CA:8
Rafaela=>1964=>CA ==========
406741:Rafaela:1964:F:CA:8
Reba=>1964=>CA ==========
406742:Reba:1964:F:CA:8
Risa=>1964=>CA ==========
406743:Risa:1964:F:CA:8
Robbi=>1964=>CA ==========
406744:Robbi:1964:F:CA:8
Rolanda=>1964=>CA ==========
406745:Rolanda:1964:F:CA:8