初學Perl的感受之資料類型

來源:互聯網
上載者:User

Perl中四種基礎資料型別 (Elementary Data Type)(就我目前所知):標量、數組、列表、雜湊。

標量應該是Perl中的原子資料結構,對程式員來說不能再分解了,類似C語言中的int、double。對於標量,我有以下看法:

“標量”這個名字很奇怪,有一種很“物理”、很“數學”的感覺,而且讓初學者以為一定還有個叫“向量”的資料類型。而實際上,標量就是一種普通的資料類型(有數學概念,跟物理沒有什麼關係),Perl中沒有叫做“向量”或者“向量”的基礎資料型別 (Elementary Data Type)。真不知道,當初Larry是怎麼想的,會起這個名字。

標量包括數值量和字串,兩者會在需要的時候相互轉換。如$v1 + $v2時,兩個標量自動轉換為數值量。轉換過程自動進行,不用顯示說明,暫時不知道有沒有顯示轉換的文法。轉換過程有一定的規則,比如$v1是“world”,那個$v1轉化為0,當然不止這一條規則。如果是$v1.$v2,則是字串拼接了,這裡面的轉換很好理解。很多時候不許要考慮是數值量還是字串,因為大多數時候是在處理字串,需要處理數值量的時候,Perl會自動做很多事情。

對於數值量的標量。Perl不區分是整型還是浮點數,Perl都按照浮點數做內部儲存和數值計算,需要的時候(比如做數組索引$array[$index]),Perl內部會做一定的轉換,但對程式員不可見和不可控,實際上也不需要。Perl在數值量上的這樣的設計,也決定了Perl不適合用於大量數值計算的程式(通過模組等外部手段加速計算,不屬於我談論的範圍),Perl本身就是為了處理文本而誕生的,在這種使用情境下,把數值量抽象和弱化,集中精力到字串上,我喜歡這種專註!

數組和列表,我目前還沒想通二者同時存在的必要,或者說二者的區別。我看的書是《Perl語言入門第四版》,網上一個不到2M、200多頁的PDF文檔。這本書在講了列表以後,基本上就只有列表了,不見$xxx[$i]的代碼了。我暫時就把數組給忘了,記住列表吧。

雜湊和其他語言中的“字典”(Python)或“map”(Golang)是一個概念。Larry把這種資料結構叫做雜湊,是因為其內部實現使用了雜湊表。想到“標量”,又是一個奇怪的命名!有時候通用的東西叫個常用的名字,和人家交流起來也方便啊。在其他時候,我們說雜湊,是指和安全、加密相關的一種技術、一種演算法、一種函數、一種特殊的字串!叫雜湊表也好啊。這些大師的想法有時候就是與眾不同,作為Perl使用者,你必須接受雜湊。

這四種資料類型,位於不同的名字空間,在變數命名上使用不同的首碼(標量$、列表@、雜湊%),所以可以使用相同的名字,而互不影響。舉下面這個例子:

#!/usr/bin/perl$v="hello world";$v[0]="hello";$v[1]="hello world";@v = qw/hello world/;%v = qw/hello world hi planet/;print "\$v=$v\n";print "\$v[0]=$v[0] \$v[1]=$v[1]\n";print "\@v=@v\n";print "\@v[0]=@v[0] \@v[1]=@v[1]\n";print "$_ in \@v\n" for @v;print "$_ => $v{$_} in %v\n" for keys %v;

輸出結果是:

$v=hello world$v[0]=hello $v[1]=world@v=hello world@v[0]=hello @v[1]=worldhello in @vworld in @vhi => planet in %vhello => world in %v

Perl有一條設計原則是不給程式員多餘的限制。從上面的程式可以看出,變數命名確實夠自由的,《Perl語言入門》的作者推薦程式員不要採取上面代碼中的做法,這樣會給程式的維護帶來不便。其實我認為,因為四種資料類型內部實現是位於不同的名字空間,所以不會出現重名的問題,如果不允許不同類型的變數有相同變數名,則需要專門的檢查,在某種可能的實現方式下,這反倒會增加額外的編碼工作,所以不做重名檢查或許是種偷懶。在其他語言中,至今未見過有類似的文法規則的。Perl中的這一條“自由”應該考慮廢止。

總體看來Perl中資料類型和Shell有很多共同之處,特別是標量,畢竟Perl一開始是在Unix上工作的。Perl這套資料類型體系對於PHP的影響比較大,PHP中進一步簡化,變數類型進一步弱化,變數首碼都是$,數組、列表和雜湊也都合并為PHP中的array。這個$符號我感覺也是多餘的,像Ruby(Perl對其也有一定的影響)中變數前就不存在這種符號了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.