Там есть функция в Perl называется wantarray
, которая возвращает:
true
если к югу вызывается в контексте списка
false
если скалярная
undef
если ни.
В качестве примера:
use strict;
use warnings;
sub wantarray_test {
if (not defined wantarray()) {
print "Called in void context by ", caller(), "\n";
}
else {
if (wantarray()) {
print "Called in list context by ", caller(), "\n";
return ("A", "list", "of", "results");
}
else {
print "called in a scalar context by ", caller(), "\n";
return "scalar result";
}
}
}
my @result = wantarray_test();
print "@result\n";
my $result = wantarray_test();
print $result, "\n";
wantarray_test();
Бонус вопрос:
Как вы думаете, вы получите, если вы:
print wantarray_test();
Вы можете сделать даже больше, чем это, если вы так склонны с Contextual::Return
- это позволит вам протестировать более подробные контексты, такие как разница между scalar
и boolean
. (Это полезно, например, если вы хотите протестировать процент - вы можете не хотеть рассматривать «0» как «ложь»).
Но будьте осторожны с контекстно-зависимыми функциями. Очень легко построить какое-то неожиданное поведение, которое может сильно укусить вас за линию.
Как относящаяся к вам нота - вы не должны объявлять свою субстанцию так, как вы. В Perl есть механизм, называемый прототипами, который определяет, какие аргументы вы ожидаете подпрограммой. См.: perlsub
. Вы не должны определить свой суб как:
sub testfunc()
{
# some stuff
}
Это указывает прототип, и его следует избегать, если вы не уверены, что это то, что вы хотите.
Как уже отмечали другие, вы бы использовали 'wantarray' для этого. См. 'Perldoc -f wantarray' http://perldoc.perl.org/functions/wantarray.html – shawnhcorey
Не используйте прототипы (пустые круглые скобки после поднабора). Их использование * только *, чтобы переопределить нормальную функциональность подпрограммы, создать неясные вещи, которые имитируют поведение некоторых встроенных модулей. – TLP
@TLP: если у вас нет 5.20+ и включили экспериментальные подписи (но даже там, '()' в этом случае неприемлемо) – ysth