2016-11-29 13 views
3

В perl6 я хочу назначить массив другому массиву и получить результирующий массив как отдельную сущность, но, похоже, ни прямое назначение, ни клонирование не могут делать то, что я хочу. Есть ли способ скопировать массив с одним выражением вместо написания цикла?Назначение массива perl6: указатель или копия?

To exit type 'exit' or '^D' 
> my @a=<a b c d e> 
[a b c d e] 
> my @b = <1 2 3 4 5 6 7> 
[1 2 3 4 5 6 7] 
> my @c = @a 
[a b c d e] 
> @c[3] 
d 
> @c[3]=3; 
3 
> @c 
[a b c 3 e] 
> @a 
[a b c d e] 
> @c === @a 
False 
> @c == @a 
True   # this is unexpected, @c and @a should be different, right? 
> my @[email protected] 
[a b c d e] 
> @x[3]=3 
3 
> @x 
[a b c 3 e] 
> @x === @a 
False 
> @x == @a 
True   # unexpected, @x and @a should be distinct things, right? 
> 

спасибо!

lisprog

ответ

5

Вы не повезло, не сравнить с @b, которые могли бы помочь вам понять это :)

== является числовое сравнение, поэтому, когда вы попросили список для сравнения как число он выбрал количество элементов как представление. Операторы в Perl 5 или 6 принуждают задействованные типы. Если вы хотите проверить, являются ли элементы массива одинаковыми, попробуйте оператор eqv.

Сравнение длины массивов, так что справедливо следующее:

@a == @c == @x == 5 

Try:

my @a = <a b c d e>; 
my @b = <1 2 3 4 5>; 
@a eqv @b; 

Вы можете проверить некоторые из документации вокруг этих операторов. Умный матч ~~ оператор, вероятно, больше того, что вы ожидали от ==.

https://docs.perl6.org/routine/$EQUALS_SIGN$EQUALS_SIGN https://docs.perl6.org/routine/$TILDE$TILDE

+0

Спасибо Matt !! Итак, когда я присваиваю один массив другому, содержимое копируется, и они представляют собой различные массивы, верно? – lisprogtor

+0

Да и нет. Вы получаете мелкую копию для скалярных типов. Так что вещи, которые похожи на контейнер, говорят о другом массиве, вы получаете только новый контейнер, указывающий на тот же список. Итак, пример, где, возможно, не то, что вы ожидаете: 'my @a = [1, [2,3]]; my @b = @a; @b [1] [0] = 4; 'Это изменит 2 на 4 в @a тоже! –

+0

Если вы хотите получить глубокую копию, то на это был дан ответ ранее здесь http://stackoverflow.com/questions/38582873/does-perl-6-have-a-built-in-tool-to-make-a-deep- копирования из-а-вложенных структуры данных –