Определение контекста вызова

Проблема

Требуется узнать, была ли ваша функция вызвана в скалярном или списковом контексте. Это позволяет решать разные задачи в разных контекстах, как это делается в большинстве встроенных функций 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



2013-09-10 17:05:19

Proverte kod v komentariyah gde pro list tam oshibki detskie




Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: