Как преобразовать строку в число в Perl?

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

9 ответов


вам не нужно преобразовывать его вообще:

% perl -e 'print "5.45" + 0.1;'
5.55

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

Пример 1

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

результат

123

Пример 2

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

результат

0

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 заботится больше о глаголах, чем о существительных.

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


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

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

посмотреть http://perldoc.perl.org/functions/sort.html Более подробную информацию о рода


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


$var += 0

вероятно, что вы хотите. Однако будьте осторожны, если $var is string не может быть преобразован в числовой, вы получите ошибку и $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

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

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


% perl -e "print '5.4' + '3.4';"
8.8

в сравнениях имеет значение, если скаляр является числом строки. И это не всегда можно решить. Я могу сообщить случай, когда perl извлек поплавок в" научной " нотации и использовал то же самое несколько строк ниже в сравнении:

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

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


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

Data::Dumper, вы заметите, что ваши цифры указаны. Perl рассматривает их внутренне как строки.
читать:$my_hash{} = if /(.+)=(.+)\n/;.
свалка:'foo' => '42'

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

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

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