2014-12-17 4 views
0
#!/usr/bin/perl 

use strict; 
use warnings; 

my @array = (['John', 'Apple', 6], 
       ['Adam', 'Banana', 7], 
       ['Cass', 'Orange', 7], 
       ['Brad', 'Lemon', 6], 
       ['Lisa', 'Grape', 5]); 

Столбцы - это имя, фрукты и возраст. Как использовать grep или любые другие команды для извлечения записей с одинаковым возрастом и вставлять их в другой массив? Например, если я хочу, чтобы извлечь данные с 7 лет, то результирующий массив будет что-то вроде этого:Список массивов внутри массива, которые имеют общие элементы

@age7 = (['Adam', 'Banana', 7], 
      ['Cass', 'Orange', 7]); 

Как добиться этого, если моя задача имеет несколько тысяч записей (массивов внутри массива)?

+1

'my @ age7 = grep $ _-> [2] == 7, @array;' –

ответ

0

Один из способов будет использовать хэш, например, так:

use strict; 
use warnings; 
use Data::Dumper; 

my @array = (['John', 'Apple', 6], 
       ['Adam', 'Banana', 7], 
       ['Cass', 'Orange', 7], 
       ['Brad', 'Lemon', 6], 
       ['Lisa', 'Grape', 5]); 

my %hash; 
for (@array) { 
    push @{ $hash{$_->[2]} }, $_; 
} 
print Dumper $hash{7}; 

Это, однако различия между числами, как 7 и 7.0, так как хэш-ключи являются строками. Если это проблема, вы можете всегда перебирать ключи и использовать сравнение, например if ($key >= 7.1 and $key <= 7)

+0

Спасибо за ответ ! Однако, как удалить дубликаты массивов внутри хэша? Например, когда я печатаю @ {$ хэш {7}}: '$ var1 = [ [ 'Адам', 'Banana', ], [ 'Адам', 'Banana', ], [ 'Cass', 'Orange', ] ]; ' Как удалить один из [ 'Адам', 'Banana']? Спасибо заранее! –

+0

Дедупликация также может быть выполнена с помощью хешей. Но это другой вопрос. – TLP

 Смежные вопросы

  • Нет связанных вопросов^_^