2016-01-28 1 views
3

Нередко параметр передается несколько раз.Имеет ли perl внутреннюю функцию, чтобы unquote переменной?

Вот интересный пример потери котировки на самом деле может помочь.

Первый абс() возвращает переменную без цитаты, в результате чего вторая абс возвращает правильное значение.

Мой вопрос:

ли Perl внутреннюю функцию Unquote переменную так, что я не должен закодировать таким образом? Информация

#!/usr/bin/perl -w 
use strict; 
my @nums = (
    '-0', 
    '-0.0', 
    "-0.000", 
    qw(-0.000), 
    sprintf("%.4f", "-0.0"), 
); 

print "***use single abs()\n"; 
foreach my $num(@nums){ 
    my $number = $num; 
    my $abs = abs($number); 
    print "<$num> abs <$abs>\n"; 
} 

print "\n***use abs(abs())\n"; 
foreach my $num(@nums){ 
    my $abs_abs = abs(abs($num)); 
    print "<$num> double abs <$abs_abs>\n"; 
} 

система:

uname -r 
2.6.32-573.12.1.el6.centos.plus.x86_64 
This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi 

Выходной экран:

***use single abs() 
<-0> abs <0> 
<-0.0> abs <-0> 
<-0.000> abs <-0> 
<-0.000> abs <-0> 
<-0.0000> abs <-0> 

***use abs(abs()) 
<-0> double abs <0> 
<-0.0> double abs <0> 
<-0.000> double abs <0> 
<-0.000> double abs <0> 
<-0.0000> double abs <0> 
+1

что делать, если вы сделали 'abs ($ num + 0)'? – Hambone

+0

@ Хамбоне, это трюк! Думаю, мне нужно изменить коды, которые я написал, с двойным абс. – Gang

+1

Я не могу себе представить, почему это было бы проблемой. Отрицательный ноль - это то же число, что и положительный ноль. Вы пытались с любыми ненулевыми цифрами? (BTW, я не могу воспроизвести это на perl 5.22.1) – trentcl

ответ

9

Это не проблема с кавычками - кавычки только синтаксис Perl сказать переводчику, где начинается строка и заканчивается. Perl знает, что хранимое значение представляет собой строку, но сами кавычки не хранятся в памяти.

Скорее, это артефакт специального значения с плавающей запятой «-0,0». Почти для любого использования, оно эквивалентно значению 0,0

perl -E ' $p = 0.0; $n = -0.0; say $p == $n '     ==> 1 
perl -E ' $p = 0.0; $n = -0.0; $x = 4.2; say $p+$x == $n+$x ' ==> 1 

два исключения, насколько я могу судить, это их двоичное представление и их текстовое представление.

$ perl -e 'print pack "F",0.0' | od -c 
0000000 \0 \0 \0 \0 \0 \0 \0 \0 
0000010 
$ perl -e 'print pack "F",-0.0' | od -c 
0000000 \0 \0 \0 \0 \0 \0 \0 200 
0000010 

$ perl -MDevel::Peek -e 'Dump($n=-0.0),Dump($p=0.0)' 
SV = NV(0x43523d8) at 0x434ff00 
    REFCNT = 1 
    FLAGS = (NOK,pNOK) 
    NV = -0 
SV = NV(0x43523e0) at 0x4329b58 
    REFCNT = 1 
    FLAGS = (NOK,pNOK) 
    NV = 0 

$ perl -E '$p=0.0; $n=-0.0; say for $p,$n' 
0 
-0 

(на самом деле, с Perl v5.12 я вижу 0,-0 но v5.16 это 0,0 - может быть, кто-то заметил это и установил ее)

Целые 0 и -0 не имеют этой проблемы , abs(-0.0) возвращает целое число 0, и поэтому действительно случайно, что abs, похоже, разрешает эту проблему с «цитированием».

+2

В стандарте IEEE 754 самым значительным битом является бит знака. «положительный» ноль представлен как битовая строка всех нулей, а «отрицательный» ноль - это битовая строка всех нулей, за исключением того, что установлен знаковый бит. – mob

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