簡體   English   中英

如何在 Perl 中將字符串轉換為數字?

[英]How can I convert a string to a number in Perl?

我有一個包含十進制值的字符串,我需要將該字符串轉換為浮點變量。 所以我擁有的字符串的一個例子是“5.45”,我想要一個等價的浮點數,這樣我就可以將 .1 添加到它。 我在互聯網上搜索過,但我只看到如何將字符串轉換為整數。

您根本不需要轉換它:

% 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 更關心動詞而不是名詞。” 以上真是一針見血。 在應用排序之前,您不需要將字符串轉換為浮點數。 您需要告訴排序將值排序為數字而不是字符串。 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 is string 無法轉換為數字,您將收到錯誤消息,並且 $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沒有被解釋為數字,例如從$line檢索到的"2e-77" 添加 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進行比較時注意到了這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM