#arrays #perl #scalar
#массивы #perl #скалярный
Вопрос:
Что произойдет, если я выполню отрицание массива или скаляра? Используя приведенный ниже сценарий, я получил следующие результаты:
$x = 0 ------------- $x: 0 !$x: 1 $x = 1 ------------- $x: 1 !$x: @x = () ------------- @x: !@x: 1 @x = qw ( a b ) ------------- @x: ab !@x:
Я предполагаю, что если я сделаю отрицание непустого массива или скаляра, я получу ''
, что означает в логическом контексте false
. Это правильно?
Есть ли способ сделать его «видимым»?
Что я удивляюсь, почему $x=1;
дает ''
!$x
и не 0
$x=0
дает с тех пор 1
!$x
.
Также здесь я предполагаю, что каждый вид ИСТИННОГО объекта дает ''
, если его отрицать, и каждый вид ЛОЖНОГО объекта дает 1, если его отрицать.
Написав все это, я осознал, что Perl очень последователен. Тем не менее, то, что «стандартная» ЛОЖЬ ''
(не видна), вызывает у меня дискомфорт.
Код:
my $x = 0; print "$x = 0n-------------n"; print "$x: ",$x,"n"; # 0 print "!$x: ",!$x,"nn"; # 1 print "n"; $x = 1; print "$x = 1n-------------n"; print "$x: ",$x,"n"; # 1 print "!$x: ",!$x,"nn"; # (empty?) my @x = (); print "@x = ()n-------------n"; print "@x: ",@x,"n"; # a b print "!@x: ",!@x,"nn"; # @x = qw ( a b ); print "@x = qw ( a b )n-------------n"; print "@x: ",@x,"n"; # 1 print "!@x: ",!@x,"n"; # (empty?)
Ответ №1:
Оператор !
(не) помещает свой аргумент в скалярный контекст. Массив в скалярном контексте возвращает свой размер-количество элементов, которые он содержит. Так что в вашем случае, когда вы это сделаете
!@x
Вы, по сути, делаете:
!2
Которая является пустой строкой, как вы упомянули, и нет 0
.
Он не невидим, но метод, который вы используете для его отображения, его не показывает. Вы могли бы, например, распечатать его с Data::Dumper
помощью модуля:
use Data::Dumper; print Dumper !@a;
Напечатает
$VAR1 = '';
Комментарии:
1. Re » Которая является пустой строкой, как вы упомянули, и не
0
. «, неверно. Это скаляр, который содержит как пустую строку, так и0
. На самом деле, он содержит два0
: в виде капельницы и в виде NV. Попробуйperl -we'my $x = ""; $x 0;'
иperl -we'my $x = (!1); $x 0;'
2. @ikegami Я полагаю, что IV и NV означают целочисленное значение и двойное значение. Если я запускаю оба кода, я получаю
Argument "" isn't numeric in addition ( ) at -e line 1.
и0
как результат для первого кода и0
без предупреждения для второго кода. Это означает, что''
это строка (которая вызывает предупреждение), но в контексте она рассматривается как0
таковая, поэтому результат таков0
.print !1
Почему не выводится0
? Как возможно, что скаляр может содержать два значения''
и0
?3. @giordano,
0
нужно число, поэтому он будет использовать число в скаляре.