2012-04-17 78 views
5

Tôi có một mảng đơn giản với tên trong đó và tôi muốn có thể dễ dàng in ra số lần mỗi tên xuất hiện.perl: đếm các phần tử duy nhất trong mảng

Tôi đã cố gắng tạo một tấn cho các vòng lặp một câu lệnh khác để tạo một mảng khác với các giá trị duy nhất sau đó, cố đếm các giá trị trong mảng orinal và lưu chúng trong mảng thứ 3. Điều này có vẻ quá phức tạp, và tôi muốn xem liệu có thể có một cách đơn giản hơn nhiều để làm điều này không.

Trả lời

13

Sử dụng một hash để đếm số lần mỗi tên xảy ra:

use warnings; 
use strict; 
use Data::Dumper; 
$Data::Dumper::Sortkeys=1; 

my @names = qw(bob mike joe bob); 
my %counts; 
$counts{$_}++ for @names; 
print Dumper(\%counts); 

__END__ 

$VAR1 = { 
      'bob' => 2, 
      'joe' => 1, 
      'mike' => 1 
     }; 
3

Cách dễ nhất để làm điều này là để tận dụng băm.

my @names = qw/joe bob sue bob mike sally mike bob sally dale joe/; 
my %counts; 
$counts{$_}++ for @names; 

này sẽ cung cấp cho bạn một hash giống như:

 'dale' => 1, 
     'sue' => 1, 
     'joe' => 2, 
     'mike' => 2, 
     'bob' => 3, 
     'sally' => 2 
4
my %counts; 
++$counts{$_} for @names; 
my @unique = keys(%counts); 

có thể được rút ngắn xuống còn

my %counts; 
my @unique = grep !$counts{$_}++, @names; 

Cựu mất trật tự trong những cái tên, trong khi sau này có lợi thế là gìn giữ trật tự. (Nó giữ bản sao đầu tiên.)

Cách thứ hai cũng là một cách thành ngữ để nhận được các thành viên duy nhất trong danh sách. Thông thường, số lượng đếm chỉ là một tác dụng phụ, nhưng trong đó, nó là một sản phẩm mong muốn. :)

+0

cảm ơn, trong trường hợp của tôi Đặt hàng không quan trọng nhiều nhưng tôi có thể cần điều này trong tương lai – searayman

Các vấn đề liên quan