Friday, February 12, 2010

Perl: массивы и списки

my @a = ('a', 'b', 'c', 'd');
my $x;


Каким будет результат следующих, внешне немного похожих, выражений:

  • $x = @a;

  • $x = @a[0..3];

  • $x = ('a', 'b', 'c', 'd');

  • $x = () = ('a', 'b', 'c', 'd');

3 comments:

  1. Не совсем очевидно, где в последнем случае получается массив, а не список :)

    ReplyDelete
  2. Последний случай эквивалентен $x = @{[ 'a', 'b', 'c', 'd' ]};
    Но на самом деле массива тут нет. Это присваивание списков в скалярном контексте. (List assignment in scalar context, http://docstore.mik.ua/orelly/perl/prog3/ch02_08.htm)

    ReplyDelete
  3. Ага, спасибо за ссылку!
    Выходит, что длину в скалярном контексте возвращают не только массивы, но и присваивания списков. Получается, что эквивалентно @{[..]} только по результату, а не по смыслу.

    ReplyDelete