我有一个包含十进制值的字符串,我需要将该字符串转换为浮点变量。所以我拥有的字符串的一个例子是“5.45”,我想要一个等效的浮点数,所以我可以添加 .1 到它。我在互联网上搜索过,但我只看到如何将字符串转换为整数。
9 回答
您根本不需要转换它:
% perl -e 'print "5.45" + 0.1;'
5.55
这是一个简单的解决方案:
示例 1
my $var1 = "123abc";
print $var1 + 0;
结果
123
示例 2
my $var2 = "abc123";
print $var2 + 0;
结果
0
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 更关心动词而不是名词。
您是否正在尝试做某事但它不起作用?
谷歌在搜索 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
据我了解,int()并不是用于指定数据类型的“强制转换”函数,它只是在这里(ab)用于将上下文定义为算术类型。我过去(ab)使用过 (0+$val) 来确保 $val 被视为数字。
$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
Perl 实际上只有三种类型:标量、数组和散列。甚至这种区别也是有争议的。;) 每个变量的处理方式取决于您对它的处理方式:
% perl -e "print 5.4 . 3.4;"
5.43.4
% perl -e "print '5.4' + '3.4';"
8.8
在比较中,如果标量是字符串的数字,则会有所不同。而且它并不总是可以确定的。我可以报告一个案例,其中 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 程序员)有所帮助。
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
.