Как я переставляю два массива точно таким же образом в Perl?

Вы можете..

Microsoft SLP Services забастовка> Потенциал программного обеспечения InishTech предложения способность помочь защитить код, не влияя на функциональность Ваших приложений.

ОБНОВЛЕНИЕ: (Раскрытие: Я работаю над Eazfuscator.NET) , Что делает Microsoft SLP Services забастовка>, Потенциал программного обеспечения отличающийся является способностью виртуализировать код, таким образом, Вы определенно можете . Несколько лет передали, так как вопрос первоначально задали; сегодня существует больше продуктов, доступных, которые также работают на подобной основе, такой как:

5
задан Sinan Ünür 19 August 2009 в 13:51
поделиться

4 ответа

Попробуйте (что-то вроде) это:

use List::Util qw(shuffle);
my @list1 = qw(a b c d e);
my @list2 = qw(f g h i j);
my @order = shuffle 0..$#list1;
print @list1[@order];
print @list2[@order];
22
ответ дан 18 December 2019 в 05:17
поделиться

Во-первых: параллельные массивы являются потенциальным признаком плохого кода; вы должны посмотреть, можете ли вы использовать массив объектов или хэшей и избавить себя от этой проблемы.

Тем не менее:

use List::Util qw(shuffle);

sub shuffle_together {
  my (@arrays) = @_;

  my $length = @{ $arrays[0] };

  for my $array (@arrays) {
    die "Arrays weren't all the same length" if @$array != $length;
  }

  my @shuffle_order = shuffle (0 .. $length - 1);

  return map {
    [ @{$_}[@shuffle_order] ]
  } @arrays;
}

my ($numbers, $letters) = shuffle_together [1,2,3,4,5], ['a','b','c','d','e'];

Обычно используйте shuffle для создания списка индексов в случайном порядке, а затем нарезайте фрагменты все массивы с одинаковым списком индексов.

9
ответ дан 18 December 2019 в 05:17
поделиться

Вот еще один способ:

use strict;
use warnings;

use List::AllUtils qw(pairwise shuffle);

my @list1 = qw(a b c d e);
my @list2 = qw(f g h i j);

my @shuffled_pairs = shuffle pairwise{[$a, $b]} @list1, @list2;

for my $pair ( @shuffled_pairs ) {
    print "$pair->[0]\t$pair->[1]\n";
}

Вывод:

C:\Temp> sfl
e       j
b       g
d       i
a       f
c       h

Таким образом, вы можете выполнять итерацию непосредственно по @shuffled_pairs без необходимости хранить дополнительный массив для индексов и избегайте циклов в стиле C.

6
ответ дан 18 December 2019 в 05:17
поделиться

Используйте List :: Util shuffle , чтобы перемешать список индексов и сопоставить результаты с массивами.

use strict;
use warnings;

use List::Util qw(shuffle);

my @array1 = qw( a b c d e );
my @array2 = 1..5;

my @indexes = shuffle 0..$#array1;
my @shuffle1 = map $array1[$_], @indexes;
my @shuffle2 = map $array2[$_], @indexes;

Обновление Воспользуйтесь решением Криса Джестера-Янга. Срезы массива - лучший выбор, о котором я должен был подумать.

6
ответ дан 18 December 2019 в 05:17
поделиться
Другие вопросы по тегам:

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