В Perl есть контексты, влияющие на поведение операторов и функций:
scalar) — выражение вычисляется как одно значение.list) — выражение вычисляется как список значений.Функции и операторы могут возвращать разные результаты в зависимости от контекста.
Примеры:
my @arr = (1, 2, 3); my $count = @arr; # скалярный контекст: $count = 3 my @copy = @arr; # списковый контекст: копируется весь массив my $line = <STDIN>; # читает одну строку (скалярный) my @lines = <STDIN>; # читает все строки (списковый)
Контекст можно задать явно через функцию scalar():
my $last_idx = scalar @arr; # принудительно скалярный контекст
Какое значение вернет функция
keys %hashв скалярном контексте?
Ответ: Вернет количество элементов в хэше, а не список ключей как в списковом контексте.
my %h = (a=>1, b=>2); my $num = keys %h; # $num = 2 my @keys = keys %h; # @keys = ('a', 'b')
История
В одном проекте подсчитывали количество элементов массива:
my @items = get_items(); my $cnt = @items;Позже кто-то решил присваивать
$cnt = get_items();, не понимая, что функция возвращает список — теперь всегда получалось только одно (первое) возвращаемое значение, а не количество элементов.
История
При чтении строк из файла:
my $lines = <FILE>;Ожидая получить весь файл, получили только первую строку — не учли, что в скалярном контексте возвращается единственная строка.
История
Разработчик вызвал функцию в void-контексте, не использу полученное значение:
open_my_file(); # функция возвращает дескриптор, но его не сохранилиЭто усложнило отладку — функция работала, но файл нигде не сохранялся, а ошибки не ловились.