2013-10-25 1 views
0

В Perl, если вы назначите массив скаляру, вы получите длину этого массива.Массив в скалярном контексте в Perl

Пример:

my @arr = (1,2,3,4); 
my $x = @arr; 

Теперь, если вы проверяете содержание $x, вы увидите, что $x содержит длину @arr массива.

Я хочу знать причину, почему Perl делает это. В чем причина этого? Я стараюсь на своем уровне, но не могу найти никакой веской причины. Итак, может кто-нибудь помочь мне понять причину происходящей сцены?

+0

Perl - очень «лингвистический» язык, если это имеет какой-то смысл: как и в случае с естественными языками, значение в Perl очень ** контекстуально **. См. Например, http://stackoverflow.com/a/2886844/55857 и http://perldoc.perl.org/perldata.html#Context. – FMc

ответ

1

Perl использует контексты, в которых другие языки используют функции для получения информации или преобразования значений между различными типами. Концепция контекста подробно изложена в справочной странице perldata (man perldata).

В Perl одни и те же данные выглядят по-разному в другом контексте. Массив выглядит как список его элементов в контексте списка, в то время как он выглядит как количество его элементов в скалярном контексте.

Как еще он мог выглядеть в скалярном контексте?

  • Это может быть первый элемент массива. Это можно сделать с помощью my ($x) = @arr; или my $x = shift @arr; или my $x = $arr[0];.
  • Это может быть последний элемент массива. Это можно сделать с помощью my ($x) = reverse @arr; или my $x = pop @arr; или my $x = $arr[-1];.

Я не могу придумать какой-либо другой разумный способ сделать скаляр из массива. Очевидно, что использование длины массива в качестве его скалярного значения лучше, чем эти два, потому что это несколько глобальное свойство массива, в то время как эти два являются довольно локальными. И это тоже очень логично, когда вы смотрите на типичном использовании массива в контексте скаляра:

die "Not enough arguments" if @ARGV < 5; 

Вы можете прочитать < вполне естественно, как «меньше».

Смежные вопросы