Существует ли элегантный почтовый индекс для чередования двух списков в Perl 5?

Единственный способ, с помощью которого эта ошибка будет возникать, заключается в том, что языковой уровень вашего модуля не установлен в 1.7+. Это необходимо установить либо в настройках проекта / модуля IntelliJ, файле проекта pom.xml, либо в обоих.

IntelliJ

enter image description here [/g0]

Maven

<properties>
  <maven.compiler.source>1.7</maven.compiler.source>
  <maven.compiler.target>1.7</maven.compiler.target>

Настройки модуля могут переопределять настройки проекта; если вы устанавливаете это на уровне проекта, и у вас есть определенная проблема в модуле, проверьте настройки модуля.

27
задан Community 23 May 2017 в 12:09
поделиться

7 ответов

Принятие Вас имеет точно два списка, и они - точно та же длина, вот решение первоначально 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)] }

Хотели ли Вы использовать любое изменение, зависит от того, видите ли Вы, что себя помните, как они работают, но для меня, это был расширитель ума.

36
ответ дан Aristotle Pagaltzis 23 May 2017 в 12:09
поделиться
  • 1
    I' ve, читая на одиночных элементах, но до сих пор I' ve узнал больше о различных дефектах личности, приписанных их пользователям, чем о за и против самих объектов. Спасибо за совместное использование Ваших мыслей о них, все же. Два наблюдения относительно Ваших критериев хорошего одиночного элемента: a) Неизменность. NSApp, или скорее его делегат, isn' t (окно может быть установлено непосредственно). [NSNotificationCenter defaultCenter] не непосредственно изменяем, но с помощью его методов это. b) Внедрение зависимости не применимо в Objective C, но возможно Вы имели в виду ' переданный объекту клиента для показа dependency'. – Elise van Looij 2 April 2010 в 11:41

Список:: модуль 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; 
}
29
ответ дан ThisSuitIsBlackNot 23 May 2017 в 12:09
поделиться
  • 1
    Пять лет назад я проводил политику, которая говорит: " Никогда не используйте одиночные элементы. Если Вы уверены, что Вам нужно, каждый убеждает Ваш вывод! ". был брошен вызов дважды за пять лет. Конечным результатом всегда было то же: не одноэлементное решение было лучше. – Andreas 31 March 2010 в 09:43

Algorithm::Loops действительно хорошо, если Вы делаете большую часть такого рода вещи.

Мой собственный код:

sub zip { @_[map $_&1 ? $_>>1 : ($_>>1)+($#_>>1), 1..@_] }
2
ответ дан Alan Haggai Alavi 23 May 2017 в 12:09
поделиться
  • 1
    @opetrenko, Который не является, как CUDA работает. – Aleksandr Dubinsky 21 October 2014 в 21:23
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 это помогает!

2
ответ дан jonfm 23 May 2017 в 12:09
поделиться
  • 1
    " единственный поток GPU по умолчанию, если иначе specified" не всегда придерживается nvcc. Я просто отладил программу, где я сломал долгое вычисление на одном ядре в кусочное вычисление, которое запустило ядра по одному в для () цикл. Последовательный для () ядро цикла запускает погрузку, где предыдущее для () ядро цикла бросило сторону устройства. Ошибка была то, что nvcc компилятор не видел это от просто кода хоста и пытался запустить каждое ядро одновременно. Это означало, что все ядра, но первое ядро вычисляло мусор. – opetrenko 9 July 2014 в 01:47

Это - полностью не изящное решение, и при этом это не лучшее решение никаким фрагментом воображения. Но это интересно!

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 осуществление, оставленное читателю.

0
ответ дан ephemient 23 May 2017 в 12:09
поделиться
  • 1
    @opetrenko NVCC не является компилятором кода хоста. Это - препроцессор это руки прочь к system' s компилятор (gcc). Вы дезинформированы на многих аспектах CUDA. Вместо того, чтобы разместить вводящую в заблуждение информацию на ТАК и причинить другим боль, необходимо отправить вопросы о вещах Вы don' t знают или проблемы, с которыми Вы сталкиваетесь. Возможно, кто-то, возможно, разъяснил, почему Ваш код, казалось, стал зафиксированным добавлением лишних cudaDeviceSynchronize вызовы. – Aleksandr Dubinsky 6 February 2015 в 17:52

Для массивов той же длины:

my @zipped = ( @a, @b )[ map { $_, $_ + @a } ( 0 .. $#a ) ];
10
ответ дан jmcnamara 23 May 2017 в 22:09
поделиться
  • 1
    @thecoshman: " один на thread" вещью был просто пример, это мог точно также быть различный критериум как " каждая 100-я вызывающая сторона получает новый instance". но да, статический класс был бы тем же по всем потокам, если Ваша среда делает многопоточность общей памяти. – Michael Borgwardt 31 March 2010 в 18:43

Я нахожу следующее решение простым и легким читать:

@a = (1, 2, 3);
@b = ('apple', 'orange', 'grape');
@zipped = map {($a[$_], $b[$_])} (0 .. $#a);

Я полагаю, что это также быстрее, чем решения, которые создают массив в неправильном порядке сначала и затем используют часть для переупорядочения, или решения, которые изменяют @a и @b.

13
ответ дан Frank 23 May 2017 в 22:09
поделиться
  • 1
    " Таким образом имея его, поскольку одиночный элемент является корректным design" я can' t видят, как это логически следует из желания, чтобы все клиенты использовали тот же пул. Существуют, конечно, другие, лучше, способы достигнуть этого, чем с одиночным элементом. – Andreas Brinck 31 March 2010 в 19:08
Другие вопросы по тегам:

Похожие вопросы: