94

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

4

9 回答 9

95

您根本不需要转换它:

% perl -e 'print "5.45" + 0.1;'
5.55
于 2008-11-14T00:43:28.770 回答
74

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

示例 1

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

结果

123

示例 2

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

结果

0
于 2011-12-16T19:18:03.463 回答
44

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

您是否正在尝试做某事但它不起作用?

于 2008-11-14T03:06:57.810 回答
10

谷歌在搜索 phill 提出的同一个问题(排序浮点数)时将我带到这里,所以我认为尽管线程有点旧,但还是值得发布答案。我是 perl 的新手,并且仍然对它感到困惑,但是 brian d foy 的声明“Perl 更关心动词而不是名词。” 上面真的击中了头上的钉子。在应用排序之前,您不需要将字符串转换为浮点数。您需要告诉 sort 将值排序为数字而不是字符串。IE

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

有关排序的更多详细信息,请参见http://perldoc.perl.org/functions/sort.html

于 2010-05-14T16:27:42.280 回答
9

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

于 2010-08-25T17:22:26.997 回答
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
于 2013-07-14T07:58:59.113 回答
4

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

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


% perl -e "print '5.4' + '3.4';"
8.8
于 2008-11-14T01:25:45.063 回答
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 程序员)有所帮助。

于 2012-08-27T13:58:13.040 回答
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.

于 2013-07-30T15:47:38.300 回答