2011-07-07 31 views
3

Perl中的數字和字符串之間有自動轉換。對數字和字符串之間的自動轉換效率沒有影響?

從駱駝書:

您不必擔心數字和字符串 之間的差異 ;只需使用合適的 運算符,Perl將使其全部運行 。

如果你擔心 效率,不要。 Perl一般 記得轉換結果 ,所以它只能做一次。

這是怎麼回事?我的意思是Perl如何記住它以及多少時間?

即使是一點點也不影響效率嗎?

+4

效率有很多種定義。Perl自動處理字符串值和數字值之間的轉換意味着每個標量變量都必須消耗略多於沒有這種功能的內存。這也意味着比「C」稍微有一點速度成本。但是這裏有幾個骯髒的小祕密,我會讓你參考:高效算法比微優化更重要。程序員的時間通常比機器時間更昂貴。最後:如果算法和編程成本無法抵消解釋型語言的微小成本,請使用C. – DavidO

+0

不錯,謝謝David :) –

回答

13

效率爲什麼要慢?

如果您自動或手動進行轉換,它是完全相同的。但通過自動執行,您只需輸入較少的代碼即可。

perl中的標量變量可以保存許多不同的值。運行時(perl解釋器)執行轉換並將數字保存在標量內。

你可以看到這樣的內部事情Devel::Peek

#!/usr/bin/env perl 
use Devel::Peek; 

my $value = '15'; 
Dump($value); 
$value + 5; 
Dump($value); 
$value = 5; 
Dump($value); 

輸出:

SV = PV(0x8f71040) at 0x8f82d88 
    REFCNT = 1 
    FLAGS = (PADMY,POK,pPOK) 
    PV = 0x8f7ecb8 "15"\0 
    CUR = 2 
    LEN = 4 
SV = PVIV(0x8f7a2fc) at 0x8f82d88 
    REFCNT = 1 
    FLAGS = (PADMY,IOK,POK,pIOK,pPOK) 
    IV = 15 
    PV = 0x8f7ecb8 "15"\0 
    CUR = 2 
    LEN = 4 
SV = PVIV(0x8f7a2fc) at 0x8f82d88 
    REFCNT = 1 
    FLAGS = (PADMY,IOK,pIOK) 
    IV = 5 
    PV = 0x8f7ecb8 "15"\0 
    CUR = 2 
    LEN = 4 

在這裏你可以看到,標量值(SV)具有"15"字符串作爲(PV),後做(IV)(整數值)。

標量包含一個標誌以知道哪個值是正確的。在第一個轉儲中,您看到標記POK,即PV是正確的當前值。如果你要求這個值,perl可以立即返回這個值。

添加後,您會看到「IOK」,表示「IV」值也可以。實際上變量本身沒有改變,但是因爲perl需要從字符串轉換爲int,所以需要添加一個字符串。添加後看到的是POKIOK是有效的。這意味着標量當前擁有一個有效的字符串和一個有效的整數。只要變量不變,兩個值都是有效的,並且perl不需要進行對話。

但是在將值更改爲整數5後,您會看到「POK」不再設置。該操作將IV設置爲新值並使PV值無效。只要你用$value作爲整數工作,什麼都不會發生。只要在字符串中使用$value,將立即轉換爲字符串,並將更新PV並設置POK。但只需要做一次。

+0

很好解釋,非常感謝:) –

+0

+1優秀的工作,Sid! – Axeman

+0

很好的答案。 *他*我認爲你指的是魔術師約翰遜,所有的Perl的魔力的來源:http://www.perlmonks.org/?node_id=118513 –

相關問題