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

Установка для свойства «UNMutableNotificationContent.sound» требуемого звукового файла устраняет проблемы и воспроизводит требуемый файл.

5
задан Brian Tompsett - 汤莱恩 31 May 2015 в 12:27
поделиться

3 ответа

Различные операторы в Perl контекстно-зависимы и приводят к различным результатам в списке и скалярном контексте.

Например:

my(@array) = (1, 2, 4, 8, 16);
my($first) = @array;
my(@copy1) = @array;
my @copy2  = @array;
my $count  = @array;

print "array: @array\n";
print "first: $first\n";
print "copy1: @copy1\n";
print "copy2: @copy2\n";
print "count: $count\n";

Вывод:

array: 1 2 4 8 16
first: 1
copy1: 1 2 4 8 16
copy2: 1 2 4 8 16
count: 5

Теперь:

  • $first содержит 1 (первый элемент массива), потому что круглые скобки в my($first) обеспечьте контекст массива, но существует только пространство для одного значения в $first.
  • оба @copy1 и @copy2 содержите копию @array,
  • и $count содержит 5, потому что это - скалярный контекст, и @array оценивает к числу элементов в массиве в скалярном контексте.

Более тщательно продуманные примеры могли быть созданы также (результатами является осуществление для читателя):

my($item1, $item2, @rest) = @array;
my(@copy3, @copy4) = @array, @array;

Нет никакой прямой параллели для списка и скалярный контекст на других языках, о которых я знаю.

11
ответ дан 18 December 2019 в 12:02
поделиться

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

@x = @array;  # copy an array
$x = @array;  # get the number of elements in an array

Другие операторы и функции контекстно-зависимы также:

$x   = 'abc' =~ /(\w+)/;  # $x = 1
($x) = 'abc' =~ /(\w+)/;  # $x = 'abc'
@x   = localtime();       # (seconds, minutes, hours...)
$x   = localtime();       # 'Thu Dec 18 10:02:17 2008'

То, как оператор (или функция) ведет себя в данном контексте, до оператора. Нет никаких общих правил для того, как вещи, как предполагается, ведут себя.

Можно сделать собственные подпрограммы контекстно-зависимыми при помощи wantarray функция для определения контекста вызова. Можно вынудить выражение быть оцененным в скалярном контексте при помощи scalar ключевое слово.

В дополнение к скаляру и контекстам списка Вы будете также видеть "пусто" (никакое ожидаемое возвращаемое значение) и "булевская переменная" (истинное/ложное ожидаемое значение) контексты, упомянутые в документации.

4
ответ дан 18 December 2019 в 12:02
поделиться

Это просто означает, что тип данных будет оценен на основе режима работы. Например, присвоение на скаляр означает, что правая сторона будет оценена как скаляр.

Я думаю лучшие средства о понимании, что контекст узнает о wantarray. Поэтому предположите, что = подпрограмма, которая реализует wantarray:

sub = {
  return if ( ! defined wantarray ); # void: just return (doesn't make sense for =)
  return @_ if ( wantarray ); # list: return the array
  return $#_ + 1; # scalar: return the count of the @_
}

Примеры в этом сообщении работают, как будто вышеупомянутую подпрограмму называют путем передачи правой стороны как параметра.

Что касается параллелей на других языках, да, я все еще поддерживаю, что фактически каждый язык поддерживает что-то подобное. Полиморфизм подобен на всех языках OO. Другой пример, Java преобразовывает объекты Представить в виде строки в определенных контекстах. И каждый невведенный язык сценариев, который я использовал, имеет подобные понятия.

0
ответ дан 18 December 2019 в 12:02
поделиться
Другие вопросы по тегам:

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