Подтвердить что ты не робот

Использование определенного /undef в Perl

Я планирую передать две переменные функции perl, одна из которых может быть необязательной. Я пытаюсь проверить, определен ли второй, или нет, но он работает неправильно. Когда я вызывал функцию как myFunction (18), она предполагает, что переменная $optional определена и переходит к инструкции else. Но в инструкции else, когда обращается к переменной $option, она выдает "неинициализированную" ошибку. Это точно противоположно тому, что я ожидал. Любая помощь приветствуется.

sub myFunction {
  my ($length, $optional) = (@_);
  if(undef($optional)
  {
    more code..
  }
  else
  {
    more code...
  }
}

myFunction(18)
4b9b3361

Ответ 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';

В любом случае, я часто предпочитаю иметь нормальный стандарт, а не полностью отдельный путь потока управления. Это часто хороший способ упростить код.

Ответ 2

my $optional = defined( $_[0] ) ? shift : 'Default value';

Это опасный код, поскольку он только сдвигает параметр, если он определен, если у вас есть третий параметр, это будет запутано при вызове

MyFunc( 10, undef, 20 )