【问题标题】:How do I find, count, and display unique elements of an array using Perl?如何使用 Perl 查找、计算和显示数组的唯一元素?
【发布时间】:2010-05-13 00:21:59
【问题描述】:

我是一名新手 Perl 程序员,希望得到一些帮助。我有一个数组列表,我试图将基于管道的每个元素拆分为两个标量元素。从那里我想只剔除“PJ RER Apts to Share”作为第一个元素的行。然后我想在每次元素出现时只打印第二个元素一次。我在下面写了一段代码,但不知道我哪里出错了。这可能是我忽略的一些小事。任何帮助将不胜感激。

## CODE ##

my @data = ('PJ RER Apts to Share|PROVIDENCE',  
        'PJ RER Apts to Share|JOHNSTON',  
        'PJ RER Apts to Share|JOHNSTON',  
        'PJ RER Apts to Share|JOHNSTON',  
        'PJ RER Condo|WEST WARWICK',  
        'PJ RER Condo|WARWICK');  

foreach my $line (@data) {  
    $count = @data;  
    chomp($line);  
    @fields = split(/\|/,$line);  
    if (($fields[0] =~ /PJ RER Apts to Share/g)){  
        @array2 = $fields[1];  
        my %seen;  
        my @uniq = grep { ! $seen{$_}++ } @array2;  
        my $count2 = scalar(@uniq);  
        print "$array2[0] ($count2)","\n"  
    }  
}  
print "$count","\n";  

## OUTPUT ##

PROVIDENCE (1)  
JOHNSTON (1)  
JOHNSTON (1)  
JOHNSTON (1)  
6  

【问题讨论】:

    标签: perl arrays grep unique


    【解决方案1】:

    这是非常粗略的,但我会使用 Perl 很棒的哈希数组来帮助完成这项任务。我会获取整个记录并使用它来索引哈希数组和值的增量。

    foreach (@array) {
       $myHash{$_}++;
    }
    

    完成后,循环遍历您的哈希数组,您将拥有从增量计数器计数的唯一和重复记录。

    就像我说的那样,这非常粗略,我敢肯定这种方法存在很多问题。所有的 Perl 神都开火了。

    【讨论】:

    • 这一点也不粗鲁,这是正确且惯用的做法。
    【解决方案2】:

    您可以使用List::MoreUtils 中的uniq 函数从列表中删除重复条目。通过在标量上下文中评估列表,可以轻松找到列表或数组中元素的数量:

    use strict; use warnings;
    use List::MoreUtils 'uniq';
    my @list = qw(1 1 2 3 5 8);
    
    my @uniq = uniq @list;
    print 'list with dupes removed: ', join(', ', @uniq), "\n";
    print 'number of elements in this list: ', scalar(@uniq), "\n";
    
    删除了欺骗的列表:1、2、3、5、8 此列表中的元素数:5

    【讨论】:

      【解决方案3】:

      我使用了以下脚本:

      my %elements = ( );
      
      foreach (@data) {
         chomp;
         my ($f0, $f1) = split(/\|/);
         $elements{ $f0 }{ $f1 }++;
      }
      
      while ( my ( $k, $v ) = each( %elements ) )
      {
         print "Key [$k] :\n";
         while ( my ( $field2, $count ) = each( %$v ) )
         {
            print "  Field [$field2] appeared $count times\n";
         }
      }
      

      它产生了:

      Key [PJ RER Condo] :
        Field [WARWICK] appeared 1 times
        Field [WEST WARWICK] appeared 1 times
      Key [PJ RER Apts to Share] :
        Field [JOHNSTON] appeared 3 times
        Field [PROVIDENCE] appeared 1 times
      

      这就是你要找的吗?

      【讨论】:

      • 这是对字段进行排序还是以随机顺序返回数据?
      • 如果你想让它排序,那么在最后一个while 循环中说each( sort %$v )。希望对您有所帮助!
      【解决方案4】:

      在哈希中累积每个城市的出现次数。键是城市名称,值是计数。然后对键进行排序并输出它们及其对应的值:

      my @data = ('PJ RER Apts to Share|PROVIDENCE',  
          'PJ RER Apts to Share|JOHNSTON',  
          'PJ RER Apts to Share|JOHNSTON',  
          'PJ RER Apts to Share|JOHNSTON',  
          'PJ RER Condo|WEST WARWICK',  
          'PJ RER Condo|WARWICK');  
      
      foreach my $line (@data) {   
          chomp($line);  
          @fields = split(/\|/,$line);  
          if ($fields[0] eq "PJ RER Apts to Share"){  
              $city = "\u\L$fields[1]";
              $apts{$city}++;  
      
          }  
      } 
      
      @city_sort = sort (@city);  
      print map {"$_ $apts{$_}\n";} sort(keys %apts);  
      $count = @data; 
      print "$count","\n"; 
      

      另外,您是想要计算所有列表还是只计算您想要匹配的列表。如果是后者,则将最后一行的旁边更改为:

      $count = keys %apts;
      

      【讨论】:

        猜你喜欢
        • 2012-04-28
        • 2020-04-14
        • 1970-01-01
        • 2017-03-27
        • 2015-03-07
        • 1970-01-01
        • 1970-01-01
        • 2015-04-18
        • 1970-01-01
        相关资源
        最近更新 更多