2013-03-08 3 views
1

Базовый пример: у меня есть массив ['abc','cde','efg'] и хочу разбить его на два массива. Тот, который содержит элементы, содержащие c и один с остальными элементами.Perl-эквивалент функции разделения Ruby?

В рубина я бы просто сказать:

has_c, no_c = arr.partition { |a| a.include?('c') } 

Есть простой Perl эквивалент?

ответ

9

Там в part функции в List::MoreUtils:

use List::MoreUtils 'part'; 
my $listref = [ 'abc', 'cde', 'efg' ]; 

my ($without_c, $with_c) = part { /c/ } @$listref; 

print "with c : @$with_c\n"; 
print "without: @$without_c\n"; 

Выходов:

with c : abc cde 
without: efg 
+0

У Perl нет списков. У вас есть ссылка на массив.

2

Я попробовал несколько вещей, с тройным оператором, это похоже на работу:

#!/usr/bin/perl 
use warnings; 
use strict; 

my @a = qw[abc cde efg]; 
my (@has_c, @no_c); 
push @{ \(/c/ ? @has_c : @no_c) }, $_ for @a; 

print "c: @has_c\nno: @no_c\n"; 

Update : simpli Fied.

+0

Не очень, хорошо, приятно поддерживать. Как бы вы это описали, если бы пытались быть более ясными? – tchrist

+0

@tchrist: Может быть, 'my @no_c; my @has_c = map {if (/ c /) {$ _} else {push @no_c, $ _;()}} @a; '? :-) – choroba

+0

Ницца! Если у вас есть Perl 5.14 или выше, первым аргументом 'push' может быть ссылка, и' push ((/ c /? \ @has_c: \ @no_c), $ _) для @ a' будет работать. – mob

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