2017-01-13 2 views
0

У меня есть sub с некоторыми простыми переменными и переменными, которые я объявляю и использую в sub, но когда я вызываю этот sub, я не могу их объявить.Perl, передавая массив в подпрограмму, имея дело с необъявленными переменными

, например:

sub func{ 
my ($firm1, $firm2, $possible) = @_; 
... 
if($possible eq "smth"){ # in case i passed this scalar 
} 
elsif($possible eq ("smth else" or undef/i_don_t_know)){ # in case i didn't passed this var, but i need it as at least undef or smth like that 
} 

func(bla, bla, bla); # ok 
func(bla, bla); # not ok 

Когда я попробовал это, я получил сообщение об ошибке

"Использование неинициализированного значения $ можно в строке эк в test.pl линии ..."

Как это исправить?

+1

Ваш вопрос не имеет ничего общего с декларациями. – melpomene

+0

Это очень помогло бы, если бы вы показали код, который можно скомпилировать под 'use strict' и' use warnings'. – Borodin

+0

Это очень поможет, если вы указали код, который будет скомпилирован под 'use strict' и' use warnings'. Составляя материал, который не является даже кодом Perl, ваш вопрос слишком неоднозначен. – Borodin

ответ

3

Это не проблема с декларациями. Если передать только два параметра в подпрограмму, которая начинается с

my ($firm1, $firm2, $possible) = @_; 

затем $possible является неопределенными, что означает, что устанавливается в специальное значение undef, который, как NULL, None, nil и т.д. на других языках

Как вы уже видели, вы не можете сравнить неопределенное значение, не вызывая предупреждающее сообщение, и вы должны сначала использовали оператор defined, чтобы проверить, что переменная определена

I думаю, что вы хотите проверить, определено ли значение $possible и установлено в строке smth. Вы можете сделать это таким образом

sub func { 

    my ($firm1, $firm2, $possible) = @_; 

    if (defined $possible and $possible eq 'smth') { 

     # Do something 
    } 
} 

func(qw/ bla bla bla /); # ok 
func(qw/ bla bla /);  # now also ok 
+0

Спасибо, это почти то, что мне нужно – genesi5

2

Это не проблема с объявлением, а передача неопределенного значения.

Там в несколько способов обработки:

  • Проверить defined на переменной
  • Установите на «по умолчанию» $possible //= "default_value" условно присвоить, если не определено.

Или сделать что-то еще полностью.

Смежные вопросы