Я думаю, что вы смешиваете «определенные» и «объявленные» концепции.
Вы спрашиваете «Как проверить, объявлена ли переменная в perl», но затем вы проверяете, определена ли переменная. Это две разные концепции.
В perl, если вы используете 'используйте строгий' , вы автоматически проверяете наличие любой переменной , не объявленной (используя my , local или наш ). После того, как вы объявили переменную, вы можете проверить, определена ли она (назначено ли значение).
Таким образом, в вашем тесте вы пропускаете предварительную декларацию перед проверкой на определенность
use strict;
my $x; # you are missing this part
[...] | # code
# your test for define
print defined $x? "defined\n" : "not defined\n";
Обратите внимание, что тестирование всего за $ x неверно для вашей цели:
my ($x,$y, $z);
$w; # not declared (use strict will catch it and die)
$x = 0; # declared and defined BUT if you make a logic test like 'if ($x) {}' then it will be FALSE, so don't confuse testing for **'$x'** and testing for **'defined $x'**
$y = undef; # declared but not defined
$z = 1; # declared, defined, and logial test TRUE
Наконец, ответ на ксеноррацицид кажется мне ошибочным: он предлагает 'если $ x' не является правильным для тестирования, если оно определено, как я уже говорил. Он также предлагает ', если не существует $ x', что неправильно для проверки скаляров . Тест «существует» предназначен только для ключей хеширования (и не рекомендуется для массивов).
Надеюсь, это поможет.