Ответ 1
Правильная функция defined
. undef
undefines $optional
. То, что вы хотите сделать, выглядит примерно так:
sub myFunction {
my( $length, $optional ) = @_;
if( ! defined $optional ) {
# Do whatever needs to be done if $optional isn't defined.
}
else {
# Do whatever can be done if $optional *is* defined.
}
}
Другой способ справиться с этим (особенно Perl 5.10+) - использовать "определенный или" оператор //
, например:
sub MyFunc {
my $length = shift;
my $optional = shift // 'Default Value';
# Do your stuff here.
}
То, что это делает, определяет, определено ли возвращаемое значение shift @_
. Поскольку вы уже вызвали сдвиг один раз, мы теперь тестируем второй параметр. Если он определен, присвойте значение $optional
. Если он не определен, присвойте 'Default Value'
$optional
. Конечно, вы должны придумать свой собственный нормальный стандарт.
Если вы застряли в темном возрасте до Perl 5.10, вы можете сделать то же самое:
my $optional = shift;
$optional = defined $optional ? $optional : 'Default value';
... или...
my $length = shift;
my $optional = defined( $_[0] ) ? shift : 'Default value';
В любом случае, я часто предпочитаю иметь нормальный стандарт, а не полностью отдельный путь потока управления. Это часто хороший способ упростить код.