[英]How do I find, count, and display unique elements of an array using Perl?
我是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的超棒哈希数组来帮助完成此任务。 我会记录整个记录,并用它来索引哈希数组和该值的增量。
foreach (@array) {
$myHash{$_}++;
}
完成后,循环遍历您的哈希数组,您将拥有从增量计数器开始计数的唯一和重复记录。
就像我说的那样,这很粗糙,我敢肯定这种方法存在很多问题。 你们所有的Perl众神都开除了。
您可以在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";
list with dupes removed: 1, 2, 3, 5, 8 number of elements in this list: 5
我使用以下脚本:
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
这是您要找的东西吗?
累积哈希中每个城市的出现次数。 密钥将是城市名称,值将是计数。 然后对键排序并输出它们及其对应的值:
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.