Единственный способ, с помощью которого эта ошибка будет возникать, заключается в том, что языковой уровень вашего модуля не установлен в 1.7+. Это необходимо установить либо в настройках проекта / модуля IntelliJ, файле проекта pom.xml
, либо в обоих.
IntelliJ
[/g0]
Maven
<properties>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
Настройки модуля могут переопределять настройки проекта; если вы устанавливаете это на уровне проекта, и у вас есть определенная проблема в модуле, проверьте настройки модуля.
Принятие Вас имеет точно два списка, и они - точно та же длина, вот решение первоначально merlyn (Randal Schwartz), который назвал его, парадоксальным образом погибните:
sub zip2 {
my $p = @_ / 2;
return @_[ map { $_, $_ + $p } 0 .. $p - 1 ];
}
Что происходит, вот то, что для списка с 10 элементами, во-первых, мы находим точку опоры в середине, в этом случае 5, и сохраняем ее в $p
. Затем мы составляем список индексов до той точки, в этом случае 0 1 2 3 4. Затем мы используем map
для соединения каждого индекса с другим индексом, это на том же расстоянии от точки опоры, как первый индекс от запуска, давая нам (в этом случае) 0 5 1 6 2 7 3 8 4 9. Затем мы берем часть от @_
использование, что как список индексов. Это означает это если 'a', 'b', 'c', 1, 2, 3
передается zip2
, это возвратит тот список, перестроенный в 'a', 1, 'b', 2, 'c', 3
.
Это может быть записано в отдельном выражении вдоль строк ysth как так:
sub zip2 { @_[map { $_, $_ + @_/2 } 0..(@_/2 - 1)] }
Хотели ли Вы использовать любое изменение, зависит от того, видите ли Вы, что себя помните, как они работают, но для меня, это был расширитель ума.
Список:: модуль MoreUtils имеет функцию zip/сетки, которая должна добиться цели:
use List::MoreUtils qw(zip);
my @numbers = (1, 2, 3);
my @fruit = ('apple', 'orange', 'grape');
my @zipped = zip @numbers, @fruit;
Вот источник сетчатой функции:
sub mesh (\@\@;\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@\@) {
my $max = -1;
$max < $#$_ && ($max = $#$_) for @_;
map { my $ix = $_; map $_->[$ix], @_; } 0..$max;
}
Algorithm::Loops
действительно хорошо, если Вы делаете большую часть такого рода вещи.
Мой собственный код:
sub zip { @_[map $_&1 ? $_>>1 : ($_>>1)+($#_>>1), 1..@_] }
my @l1 = qw/1 2 3/; my @l2 = qw/7 8 9/; my @out; push @out, shift @l1, shift @l2 while ( @l1 || @l2 );
, Если списки являются различной длиной, это поместит 'undef' в дополнительные слоты, но можно легко исправить это, если Вы не хотите делать это. Что-то как (@l1[0] & & сместитесь @l1) сделал бы это.
Hope это помогает!
Это - полностью не изящное решение, и при этом это не лучшее решение никаким фрагментом воображения. Но это интересно!
package zip;
sub TIEARRAY {
my ($class, @self) = @_;
bless \@self, $class;
}
sub FETCH {
my ($self, $index) = @_;
$self->[$index % @$self][$index / @$self];
}
sub STORE {
my ($self, $index, $value) = @_;
$self->[$index % @$self][$index / @$self] = $value;
}
sub FETCHSIZE {
my ($self) = @_;
my $size = 0;
@$_ > $size and $size = @$_ for @$self;
$size * @$self;
}
sub CLEAR {
my ($self) = @_;
@$_ = () for @$self;
}
package main;
my @a = qw(a b c d e f g);
my @b = 1 .. 7;
tie my @c, zip => \@a, \@b;
print "@c\n"; # ==> a 1 b 2 c 3 d 4 e 5 f 6 g 7
Как обработать STORESIZE
/PUSH
/POP
/SHIFT
/UNSHIFT
/SPLICE
осуществление, оставленное читателю.
cudaDeviceSynchronize
вызовы.
– Aleksandr Dubinsky
6 February 2015 в 17:52
Для массивов той же длины:
my @zipped = ( @a, @b )[ map { $_, $_ + @a } ( 0 .. $#a ) ];
Я нахожу следующее решение простым и легким читать:
@a = (1, 2, 3);
@b = ('apple', 'orange', 'grape');
@zipped = map {($a[$_], $b[$_])} (0 .. $#a);
Я полагаю, что это также быстрее, чем решения, которые создают массив в неправильном порядке сначала и затем используют часть для переупорядочения, или решения, которые изменяют @a
и @b
.