Как я могу преобразовать строку в число в Perl? - PullRequest
79 голосов
/ 14 ноября 2008

Как мне преобразовать строку, содержащую число, в ее числовое значение в Perl?

Ответы [ 9 ]

87 голосов
/ 14 ноября 2008

Вам вообще не нужно конвертировать:

% perl -e 'print "5.45" + 0.1;'
5.55
68 голосов
/ 16 декабря 2011

Это простое решение:

Пример 1

my $var1 = "123abc";
print $var1 + 0;

Результат

123

Пример 2

my $var2 = "abc123";
print $var2 + 0;

Результат

0
40 голосов
/ 14 ноября 2008

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

# numeric addition with strings:
my $sum = '5.45' + '0.01'; # 5.46

Если вы делаете что-то вроде строк, вы получаете строки:

# string replication with numbers:
my $string = ( 45/2 ) x 4; # "22.522.522.522.5"

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

Вы пытаетесь что-то сделать, и это не работает?

9 голосов
/ 14 мая 2010

Google привел меня сюда во время поиска по тому же вопросу, который задал Фил (сортировка чисел с плавающей точкой), поэтому я подумал, что было бы целесообразно опубликовать ответ, несмотря на то, что тема была довольно старой. Я новичок в Perl и все еще держу голову над этим, но заявление Брайана Д. Фоя «Perl больше заботится о глаголах, чем о существительных». выше действительно бьет гвоздь по голове. Вам не нужно преобразовывать строки в числа с плавающей точкой перед применением сортировки. Вы должны указать сортировку для сортировки значений в виде чисел, а не строк. т.е.

my @foo = ('1.2', '3.4', '2.1', '4.6');
my @foo_sort = sort {$a <=> $b} @foo;

См. http://perldoc.perl.org/functions/sort.html для более подробной информации о сортировке

7 голосов
/ 25 августа 2010

Насколько я понимаю, int () не предназначена как функция «cast» для обозначения типа данных, она просто (ab) используется здесь для определения контекста как арифметического. Я (ab) использовал (0 + $ val) в прошлом, чтобы гарантировать, что $ val рассматривается как число.

6 голосов
/ 14 июля 2013
$var += 0

вероятно, что вы хотите. Однако, будьте осторожны, если $ var строка не может быть преобразована в числовое значение, вы получите ошибку, и $ var будет сброшено до 0 :

my $var = 'abc123';
print "var = $var\n";
$var += 0;
print "var = $var\n";

Журналы

var = abc123
Argument "abc123" isn't numeric in addition (+) at test.pl line 7.
var = 0
3 голосов
/ 14 ноября 2008

Perl действительно имеет только три типа: скаляры, массивы и хэши. И даже это различие является спорным. ;) Способ обработки каждой переменной зависит от того, что вы с ней делаете:

% perl -e "print 5.4 . 3.4;"
5.43.4


% perl -e "print '5.4' + '3.4';"
8.8
1 голос
/ 27 августа 2012

При сравнении имеет значение, если скаляр - это число строки. И это не всегда решаемо. Я могу сообщить о случае, когда Perl нашел число с плавающей точкой в ​​«научной» записи и использовал те же несколько строк ниже для сравнения:

use strict;
....
next unless $line =~ /and your result is:\s*(.*)/;
my $val = $1;
if ($val < 0.001) {
   print "this is small\n";
}

И здесь $val не интерпретировалось как числовое значение, например "2e-77" извлечено из $line. Помогло добавление 0 (или 0.0 для хороших программистов на ole C).

0 голосов
/ 30 июля 2013

Perl слабо типизирован и основан на контексте. Многие скаляры могут рассматриваться как строки и числа, в зависимости от используемых вами операторов. $a = 7*6; $b = 7x6; print "$a $b\n";
Вы получаете 42 777777.

Однако есть небольшая разница. Когда вы читаете числовые данные из текстового файла в структуру данных, а затем просматриваете их с Data::Dumper, вы заметите, что ваши числа указаны в кавычках. Perl рассматривает их внутренне как строки.
Читать: $my_hash{$1} = $2 if /(.+)=(.+)\n/;.
Dump: 'foo' => '42'

Если вы хотите, чтобы в дампе были цифры без кавычек:
Читать: $my_hash{$1} = $2+0 if /(.+)=(.+)\n/;.
Dump: 'foo' => 42

После $2+0 Perl замечает, что вы рассматривали $ 2 как число, потому что вы использовали числовой оператор.

Я заметил это, пытаясь сравнить два хэша с Data::Dumper.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...