如何在Perl中将字符串转换为数字?


86

我有一个包含十进制值的字符串,我需要将该字符串转换为浮点变量。因此,我拥有的字符串的示例为“ 5.45”,我想要一个等效的浮点数,因此可以向其添加.1。我已经在互联网上进行搜索,但是只看到如何将字符串转换为整数。


这个问题需要进一步详细说明。字符串仅由数字组成吗?字母数字?确定是否删除了Alpha?生成的数字有特定用途吗?
JGurtz'3

Answers:


90

您根本不需要转换它:

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

25
5.55不是整数
OrangeDog 2012年

15
OP的@OrangeDog编辑了问题(发布此答案后的几个月)-原始问题实际上包含浮点数。
Alnitak

1
当字符串中包含逗号时,如何进行比较呢?
拉米2014年

[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;'
拉米2014年

73

这是一个简单的解决方案:

例子1

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

结果

123

例子2

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

结果

0

7
AFAIU,这是所提出问题的唯一答案
Cougar

4
将零添加到字符串时要当心。如果字符串以“ inf”或“ nan”开头,则该值将不会为零。例如,我的$ var2 =“ info123”; 打印$ var2 + 0:结果将是:Inf
Rodrigo De Almeida Siqueira

我正在做,foreach my $i ('00'..'15')并且需要在某些地方删除前导零。这种0+转换为数字也可以实现这一点。
stevesliva '16

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 2012年

4
我不乘数字。该x是字符串复制操作。
brian d foy 2013年

3
应该不是my $string = ( 45/2 ) x 3; # "22.522.522.5"45而不是44?否则,我不会知道结果中的“ .5”来自哪里……
Vickster

10

Google在搜索phill所问的同一问题(对浮点数进行排序)时引导我来到这里,所以我认为尽管线程有点陈旧,还是值得发布答案。我是perl的新手,但仍然对它感到迷惑,但是brian d foy的声明“ 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)使用(0 + $ val)以确保将$ val视为数字。


是的,int()正在“滥用”;得到它了。
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(或对于优秀的ole C程序员为0.0)会有所帮助。


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+0Perl注意到您将$ 2视为数字之后,因为您使用了数字运算符。

我在尝试与比较两个哈希值时注意到了这一点Data::Dumper

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.