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

86

У меня есть строка, содержащая десятичное значение, и мне нужно преобразовать эту строку в переменную с плавающей запятой. Итак, у меня есть пример строки «5.45», и мне нужен эквивалент с плавающей запятой, чтобы я мог добавить к нему .1. Я искал в Интернете, но вижу только, как преобразовать строку в целое число.

Антон
источник
Вопрос требует дополнительных подробностей. Строка состоит только из цифр? Буквенно-цифровой? Хорошо, если альфы убраны? Есть ли какое-то конкретное назначение у получившегося числа?
JGurtz 01

Ответы:

90

Его вообще не нужно конвертировать:

% perl -e 'print "5.45" + 0.1;'
5.55
Альнитак
источник
26
5.55 - не целое число
OrangeDog
15
@OrangeDog OP редактировал вопрос (через несколько месяцев после того, как этот ответ был опубликован) - в исходном вопросе фактически были числа с плавающей запятой.
Alnitak
1
как насчет сравнения, когда в строке есть запятая?
Ramy
[rabdelaz@Linux_Desktop:~/workspace/akatest_5]$perl -e 'print "nope\n" unless "1,000" > 10;' nope [rabdelaz@Linux_Desktop:~/workspace/akatest_5]$perl -e 'print "nope\n" if "1,000" > 10;'
Ramy
73

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

Пример 1

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

Результат

123

Пример 2

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

Результат

0
Porquero
источник
7
AFAIU, это единственный ответ на то, что спросили
Cougar
4
Будьте осторожны при добавлении нуля к строке. Если строка начинается с «inf» или «nan», значение не будет нулевым. Например, мой $ var2 = "info123"; print $ var2 + 0: Результат будет: Inf
Родриго Де Алмейда Сикейра
Я делал a, foreach my $i ('00'..'15')и мне нужно было удалить ведущие нули в некоторых местах. Это 0+приведение к числу также позволяет добиться этого.
stevesliva
По-видимому, это не работает с шестнадцатеричными строками: '0x14C' + 0 приводит к 0 (arrggg)
Allasso
41

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

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

Брайан Д Фой
источник
Простите за незнание, но я не совсем понимаю ваш второй пример. Вы делите два числа, а затем умножаете их, как / почему в результате получается строка?
gideon
4
Я не умножаю числа. Оператор xрепликации строки.
brian d foy
3
Разве не должно быть my $string = ( 45/2 ) x 3; # "22.522.522.5"45 вместо 44? Иначе я не
пойму, откуда взялись
10

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 для получения дополнительной информации о сортировке.

Норма
источник
8

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

Маккатчм
источник
да, int()используется "(ab)"; понял.
Sapphire_Brick
6
$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

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

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


% perl -e "print '5.4' + '3.4';"
8.8
Рини
источник
5
Perl имеет гораздо больше типов, но для отдельных значений это просто одно значение.
brian d foy
1

При сравнении имеет значение, является ли скаляр числом в строке. И это не всегда разрешимо. Я могу сообщить о случае, когда 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 для хороших программистов на C) помогло.

Штеффен Мёллер
источник
0

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

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

Если вы хотите некотируемые номера в отвал:
Read: $my_hash{$1} = $2+0 if /(.+)=(.+)\n/;.
Дамп:'foo' => 42

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

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

SzG
источник