Perl: Как следует интерпретировать отрицание массива и скаляра?

#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, print нужна строка, поэтому он будет использовать строку в скаляре. 0 нужно число, поэтому он будет использовать число в скаляре.