В Perl, в чем разница между
$status = 500;
и
$status = '500';
Не много. Они обе назначают пятисот до $статус
. Используемый формат будет отличаться изначально (ИЖ против ПВ кодировке utf8=0), но это'ы не имеет значения в Perl.
Однако, есть вещи, которые ведут себя по-разному выбор формата хранения, хотя они должны'т. На основе выбора формата хранения,
&
, |
и ^
) угадать, будет ли их операнды являются строками или нет.Как уже @Икегами много сказано не. Но помните, чем здесь большая разница между
$ perl -E '$v=0500; say $v'
печатает 320
(десятичное значение 0500 восьмеричное число), и
$ perl -E '$v="0500"; say $v'
что печатает
0500
и
$ perl -E '$v=0900; say $v'
что умирает с ошибкой:
Illegal octal digit '9' at -e line 1, at end of line
Execution of -e aborted due to compilation errors.
И
perl -E '$v="0300";say $v+1'
печать
301
но
perl -E '$v="0300";say ++$v'
печать
0301
похожие с префиксом 0x\д+
, электронная.г:
$v = 0x900;
$v = "0x900";
Есть только разница, если вы затем использовать `$ВАР с одним из немногих операторов, который имеет различные ароматы при работе на строки или числа:
$string = '500';
$number = 500;
print $string & '000', "\n";
print $number & '000', "\n";
выход:
000
0
Чтобы предоставить немного больше контекста о "не сильно" и ответы, вот это представление внутренних структур данных двух значений через модуль Devel::модуль Ку:
user@foo ~ $ perl -MDevel::Peek -e 'print Dump 500; print Dump "500"'
SV = IV(0x7f8e8302c280) at 0x7f8e8302c288
REFCNT = 1
FLAGS = (PADTMP,IOK,READONLY,pIOK)
IV = 500
SV = PV(0x7f8e83004e98) at 0x7f8e8302c2d0
REFCNT = 1
FLAGS = (PADTMP,POK,READONLY,pPOK)
PV = 0x7f8e82c1b4e0 "500"\0
CUR = 3
LEN = 16
Вот дамп на Perl делает то, что вы имеете в виду:
user@foo ~ $ perl -MDevel::Peek -e 'print Dump ("500" + 1)'
SV = IV(0x7f88b202c268) at 0x7f88b202c270
REFCNT = 1
FLAGS = (PADTMP,IOK,READONLY,pIOK)
IV = 501
Первое число (целое число между 499 и 501). Вторая строка (символы '5', '0', и '0'). Это'ы не правда что там's никакой разницы между ними. Это'ы не правда что один будет конвертирован сразу в другую. Это составляет правда, что строки преобразуются в числа, когда надо, и наоборот, преобразование в основном прозрачный, но не полностью.
Ответ когда делает разницу между строкой и количество материи в Perl 5 покрывает некоторые случаи, где они'ре не эквивалент:
и
$Г = "в 1000000000000000 и"тогда $X может преобразовать в строки в
1е+15. С помощью переменной, в качестве хэш-ключ строкового представления, что означает, что
$хэш{$х}и
$хэш{$г}` могут быть разными хэш-слотов.~~
) и дается/когда операторы лечить доводы число отлично от числовых. Лучше эти операторы так или иначе избежать.Я думаю, что это прекрасно демонстрирует то, что происходит.
$ perl -MDevel::Peek -e 'my ($a, $b) = (500, "500");print Dump $a; print Dump $b; $a.""; $b+0; print Dump $a; print Dump $b'
SV = IV(0x8cca90) at 0x8ccaa0
REFCNT = 1
FLAGS = (PADMY,IOK,pIOK)
IV = 500
SV = PV(0x8acc20) at 0x8ccad0
REFCNT = 1
FLAGS = (PADMY,POK,pPOK)
PV = 0x8c5da0 "500"\0
CUR = 3
LEN = 16
SV = PVIV(0x8c0f88) at 0x8ccaa0
REFCNT = 1
FLAGS = (PADMY,IOK,POK,pIOK,pPOK)
IV = 500
PV = 0x8d3660 "500"\0
CUR = 3
LEN = 16
SV = PVIV(0x8c0fa0) at 0x8ccad0
REFCNT = 1
FLAGS = (PADMY,IOK,POK,pIOK,pPOK)
IV = 500
PV = 0x8c5da0 "500"\0
CUR = 3
LEN = 16
Каждой скалярной ("СВ") может иметь строка (ПВ
) и / или числовое представление (ИЖ
). Как только вы используете переменную только строковое представление в любые числовые операции и один с только числовое представление в любой Строковой операции у них обоих представлениях. Чтобы быть правильным, не может быть и другое представление числа, представление с плавающей запятой (НВ
) таким образом, есть три возможных представления скалярного значения.
Много ответов уже на этот вопрос, но я'МР дать ему шанс на путать новичка:
my $foo = 500;
my $bar = '500';
Как они, для практического pourposes они quot В&; же как". Самая интересная часть-это когда вы используете операторы. Например:
print $foo + 0;
output: 500
В '+' оператор видит ряд слева и ряд справа, как десятичные, следовательно, ответ равен 500 + 0 => 500
print $bar + 0;
output: 500
Тоже выход, оператор видит строку, которая выглядит как десятичное целое число слева, а ноль справа, значит 500 + 0 => 500
Но где отличия? Это зависит от используемого оператора связи. Операторы решили, что'ы произойдет. Например:
my $foo = '128hello';
print $foo + 0;
output: 128
В этом случае он ведет себя как ятвой() в C. Это происходит в самый большой числовой части, начиная с левой и использует его как число. Если нет номера, он использует его как 0.
Как бороться с этим в условные?
my $foo = '0900';
my $bar = 900;
if( $foo == $bar)
{print "ok!"}
else
{print "not ok!"}
output: ok!
== сравнивает числовое значение в обоих переменных. если вы используете предупреждения он будет жаловаться через == со строками, но он по-прежнему будет пытаться сподвигнуть.
my $foo = '0900';
my $bar = 900;
if( $foo eq $bar)
{print "ok!"}
else
{print "not ok!"}
output: not ok!
экв сравнение строк на равенство.
Вы можете попробовать на "^" и оператор.
my $str = '500';
my $num = 500;
if ($num ^ $num)
{
print 'haha\n';
}
if ($str ^ $str)
{
print 'hehe\n';
}
$ул. ул. ^ $отличается от $числ ^ $num, так что вы получите и"хе-хе" по. ПС, на "^" и будут меняться аргументы, так что вы должны сделать
my $temp = $str;
if ($temp ^ $temp )
{
print 'hehe\n';
}
. Я обычно использую этот оператор, чтобы отличить и ул. Нум в Perl.