Определение контекста вызова
Проблема
Требуется узнать, была ли ваша функция вызвана в скалярном или списковом контексте.
Это позволяет решать разные задачи в разных контекстах, как это делается в
большинстве встроенных функций Perl.
Решение
Воспользуйтесь функцией
wantarray(), которая возвращает три разных значения
в зависимости от контекста вызова текущей функции:
if (wantarray()) {
# Списковый контекст
}
elsif (defined wantarray()) {
# Скалярный контекст
}
else {
# Неопределенный контекст
}
Комментарий
Многие встроенные функции, вызванные в скалярном контексте, работают совсем не так, как в
списковом контексте. Пользовательская функция может узнать контекст своего вызова с помощью
значения, возвращаемого встроенной функцией wantarray. Для спискового контекста wantarray
возвращает true. Если возвращается ложное, но определенное значение, функция используется в
скалярном контексте. Если возвращается
undef,
от функции вообще не требуется возвращаемого значения.
if (wantarray()) {
print "In list context\n";
return @many_things;
} elsif (defined wantarray()) {
print "In scalar context\n";
return $one_thing;
} else {
print "In void context\n";
return; # Ничего
}
mysub(); # Неопределенный контекст
$a = mysub(); # Скалярный контекст
if (mysub()) { ... } # Скалярный контекст
@a = mysub(); # Списковый контекст
print mysub(); # Списковый контекст
См. такжеОписание функций
return и
wantarray
Proverte kod v komentariyah gde pro list tam oshibki detskie
Оставить комментарий:
|
|