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

时间:2008-11-14 00:39:16

标签: string perl floating-point

如何将包含数字的字符串转换为Perl中的数值?

9 个答案:

答案 0 :(得分:87)

您根本不需要转换它:

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

答案 1 :(得分:68)

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

示例1

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

结果

123

示例2

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

结果

0

答案 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更关心动词而不是名词。

您是否正在尝试做某事并且无法正常工作?

答案 3 :(得分:9)

谷歌引导我在这里搜索同样的问题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

答案 4 :(得分:7)

据我了解,int()并不是用于指定数据类型的“强制转换”函数,它只是(ab)用于将上下文定义为算术类型。我(ab)过去使用过(0 + $ val)来确保$ val被视为一个数字。

答案 5 :(得分: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

答案 6 :(得分:3)

Perl实际上只有三种类型:标量,数组和散列。甚至这种区别也是有争议的。 ;)处理每个变量的方式取决于你用它做什么:

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


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

答案 7 :(得分: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程序员)有帮助。

答案 8 :(得分: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进行比较时注意到了这一点。