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

73

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

  • 4
    Некоторые ответы сбивают с толку, потому что вопрос был отредактирован. Ответ от Porquero является лучшим для этой версии вопроса.
  • 0
    Вопрос требует дополнительных подробностей. Строка состоит только из цифр? Буквенно-цифровой? Хорошо, если альфы раздели? Есть ли конкретная цель для полученного числа?
Теги:
string
floating-point

9 ответов

82
Лучший ответ

Вам совсем не нужно его конвертировать:

% perl -e 'print "5.45" + 0.1;'
5.55
  • 22
    5.55 не является целым числом
  • 14
    @OrangeDog ОП отредактировал вопрос (через несколько месяцев после того, как этот ответ был опубликован) - в оригинальном вопросе фактически были числа с плавающей запятой.
Показать ещё 2 комментария
51

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

Пример 1

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

Результат

123

Пример 2

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

Результат

0
  • 6
    AFAIU это единственный ответ на то, что спросили
  • 0
    @Cougar: я согласен.
Показать ещё 2 комментария
40

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

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

  • 0
    Простите, что у меня нет знаний, но я не совсем понимаю ваш второй пример. Вы делите два числа, а затем умножаете их, как / почему это приводит к строке?
  • 4
    Я не умножаю числа. x - оператор репликации строк.
Показать ещё 2 комментария
9

Google привел меня сюда при поиске по тому же вопросу, который задавал phill (сортировка поплавков), поэтому я решил, что стоит опубликовать ответ, несмотря на то, что нить была старой. Я новичок в perl, и я все еще обнимаю голову, но выражение brian d foy: "Perl больше заботится о глаголах, чем о существительных". выше действительно ударяет ноготь по голове. Вам не нужно преобразовывать строки в float перед применением сортировки. Вам нужно указать сортировку для сортировки значений как чисел, а не строк. то есть.

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

Подробнее о сортировке

см. http://perldoc.perl.org/functions/sort.html.
6
$var += 0

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

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

3

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

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


% perl -e "print '5.4' + '3.4';"
8.8
  • 4
    Perl имеет гораздо больше типов, но для отдельных значений это просто одно значение.
  • 2
    Вы также можете добавить 0
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 для хороших программистов ole 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'

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню