2015-10-16 66 views
1

字符串轉換據我瞭解當過像數字在Perl

$a="120.43sunil"+5;  

一個字符串,它會給像

$a=125.43  

一個結果,因爲字符串不是一個數字的「蘇尼爾」部分會被省略。 如果我們得到這樣

$a="12fred34"*" 3" 

一些事情將字符串轉換爲1234或12034? 這是一個新的perl編程。

+4

你試過了嗎? – Jens

+3

似乎很奇怪,你會問這是一個問題,而不是僅僅嘗試一下。 –

回答

9

如果你打開strictwarnings - 就像你真的應該 - 它會警告你。

這是好的,因爲這是一個壞主意。

如果你嘗試你的代碼,你會看到你的第二個例子給出了:

my $val="12fred34"*" 3" ; 
print $val; 

給出:

Argument "12fred34" isn't numeric in multiplication (*) 
36 

perl被 「發現」 的12個,並使用,丟棄其餘。

你的第一個例子的方式 - 也警告說:

Argument "120.43sunil" isn't numeric in addition (+) 

不過說真的 - 這僅僅是一個壞主意。

perl它可以隱式地將字符串轉換爲數字,但會警告,如果它不能。這是因爲在你的第二個例子中,它是不明確的。文本應該爲零嗎?忽略?這是甚至一個數字,還是兩個?

如果您確實需要將字符串的一部分轉換爲數字,則應首先解析字符串,然後提取所需的值。這可能是因爲

$val =~ s/\D//g; 

一樣簡單,但它可能是:

@vals = $str =~ m/(\d+)/g; 

如果你真的想這樣做與數字和字符串果香的東西,看dualvar *:

#!/usr/bin/env perl 
use strict; 
use warnings; 

use Scalar::Util qw (dualvar); 

my $val = dualvar (120.43, "sunil"); 

print $val,"\n"; 
print $val + 0; #force numeric context; 

雖然我們在此 - 不要使用$a$b - 它們是在perl-sort ing中具有特定用途的變量。無論如何,你不應該使用單字母變量,這是一種糟糕的編碼習慣。

*我不會真的建議與dualvars亂搞 - 他們真的很酷,但可以讓使用是否嚴重一些非常可怕的代碼,這會可能發生什麼,如果你是「一種新的perl編程「

+1

我認爲,總結起來!可惜你讓'dualvars'走出它的籠子,儘管 – Borodin

+0

如果有人想要在腳下自我射擊的新方法,那麼我該爭論誰呢? – Sobrique

0

Perl中的字符串到數字轉換的工作方式非常類似於C函數strtod。也就是說,Perl期望可選的前導空格,可選符號(+-),某些數字(可選包含.)和可選指數(eE,可選符號(+-),更多數字)。

作爲特殊情況,字NaNInf(不區分大小寫)也被識別爲數字。

如果字符串中包含更多字符,它們將被忽略但會觸發警告(如果警告已啓用)。有一個例外:字符串"0 but true"轉換爲0而不發出警告。

如果字符串未以有效數字開頭,則返回0(並且還會發出警告)。

+1

''0但是true''也是一個特殊情況 – ysth

+0

0但是,真正的情況是我可能會試圖觸發Contextual :: Return,它可以讓你知道布爾和標量上下文之間的區別。 – Sobrique

+0

@Sobrique Contextual ::返回是一個可怕的想法,並且(像所有達米安模塊一樣)不應該被使用,除了在玩具程序恕我直言。 – melpomene