亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
123下一頁
最近訪問板塊 發(fā)新帖
查看: 25923 | 回復: 21
打印 上一主題 下一主題

一個perl 引用的資料 [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2005-03-03 17:12 |只看該作者 |倒序瀏覽
為推廣perl盡一點力,特將perl引用的一篇文章翻譯了一下,沒有仔細查錯,有問題請和我聯(lián)系。本文可以從下面地址獲得英文版本:
http://search.cpan.org/~nwclark/perl-5.8.6/pod/perlreftut.pod



perlreftut - Mark 的一個簡單的'引用'教程


*名稱  
*描述  
*誰需要復雜的數據結構?
*解決辦法
*語法
     >;創(chuàng)建應引用  
         創(chuàng)建規(guī)則 1
       >;使用引用
         使用規(guī)則1
              使用規(guī)則2
        >;一個例子
     >;箭頭符號規(guī)則
解決方法  
其他集錦
摘要  
感謝  
     >;發(fā)布要求

--------------------------------------------------------------------------------


名稱
perlreftut - Mark的一個簡單的'引用'教程



--------------------------------------------------------------------------------


描述
在perl5中,一個重要的功能是提供了處理復雜數據類型的能力,比如多緯數組和嵌套的哈希。為了實現這個,perl5引入了一個要素-'引用',并使用引用來處理perl中復雜的、結構化的數據。 不幸的是,這里有大量的有趣的語法需要學習,但手冊卻很難理解。手冊描述的相當完整,但是有時候人們卻發(fā)現一個問題,它不能告訴人們那些是重要的,那些是不重要的。

幸運地是,你只需要了解手冊上10%的知識得到90%的好處。本文就是告訴你其中的10%。



--------------------------------------------------------------------------------

誰需要復雜的數據結構?
始終伴隨著Perl 4的一個問題是怎么樣來描述一個值是列表的哈希表。Perl 4 有哈希但是它的值必須是標量,不能是列表。

你為什么需要一個列表的哈希結構呢?讓我們來看一個簡單的例子:你有一個包含城市和國家名稱的文件,如下:

        Chicago, USA
        Frankfurt, Germany
        Berlin, Germany
        Washington, USA
        Helsinki, Finland
        New York, USA
你想按照下面的格式輸出,每一個國家出現一次,然后是一個按照字母順序的該國家內城市的列表,如下:

        Finland: Helsinki.
        Germany: Berlin, Frankfurt.
        USA:  Chicago, New York, Washington.

一個很自然的解決方法是將國家的名稱設置為一個哈希結構的鍵,和國家名稱對應的健值是這些國家內的城市的一個數組。 每一次,你讀取一行輸入,將其分成國家和城市兩個數據。查看'國家名稱'的鍵所對應的城市列表,然后把新的城市加入那個列表中。當你完成了整個輸入,然后將整個哈希中每個健對應的健值-城市名的列表作一個排序,然后打印出來。

如果哈希值不能是列表,你就無法完成工作了。在Perl 4中,哈希的值不能是列表。它們只能是字符串。所以你必須把所有的城市名合并成一個字符串。當需要輸出時,你再把這個字符串分拆成一個列表,然后對列表排序,最后將列表中的數據轉成字符串輸出。這樣做非常煩瑣并容易出錯。而且讓人沮喪的是,Perl已經擁有的優(yōu)秀的列表功能無法使用了。



--------------------------------------------------------------------------------

解決方法
當Perl進化到Perl 5時,我們必須考慮到哈希原來的設計:哈希的鍵值必須是標量。解決辦法就是采用'引用'。

一個'引用'就是一個指向一個完整列表或完整哈希(或指向其他的東西,比如函數)的標量值。名字就是你比較熟悉的一種'引用'。 考慮一下美國的總統(tǒng):一包雜亂的血肉。但是當我們談到它,或者需要在計算機程序中描述它,你需要的只是一個簡單的標量'George Bush'。

Perl中的'引用'就像列表和哈希的名字。它們是Perl中私有的,內部的名字,所以你可以確信它們是明確的,不像'George Bush', 一個'引用'只指向一個東西。你總是可以知道它指向什么。如果你有一個指向數組的'引用',你可以從它恢復出整個數組。如果你有一個指向哈希的'引用',你可以根據它恢復出整個哈希。但是這個'引用'仍舊是一個簡單、緊湊的標量。

你不能使用一個健值是數組的哈希;哈希的健值必須是標量。我們被這個束縛住了。但是一個簡單的'引用'能指向一個完整的數組,'引用'是標量,所以你可以使用指向數組的'引用'組成的哈希,它就像一個數組的哈希一樣,和數據的哈希一樣有用。

稍后我們會再回到這個‘城市-國家’的問題來。我們先來看一些操作'引用'的語法。



--------------------------------------------------------------------------------


語法
創(chuàng)建'引用'僅有兩種方法,使用它也是兩種。


創(chuàng)建引用

創(chuàng)建規(guī)則 1
如果你在一個變量前加一個'\'號,你就得到了這個變量的'引用'。

    $aref = \@array;         # $aref 保存著指向@array的'引用'
    $href = \%hash;          # $href 保存著指向%hash的'引用'
當你把'引用'保存在類似 $aref 或 $href的變量中,你就可以象操作其他標量一樣copy或保存它。

    $xy = $aref;             # $xy 現在保存了指向 @array 的'引用'
    $p[3] = $href;           # $p[3] 現在保存了指向 %hash 的'引用'
    $z = $p[3];              # $z 現在保存了指向 %hash 的'引用'
這些例子展示了如何創(chuàng)建命名變量的'引用',但是有時候,我們創(chuàng)建的數組或哈希沒有名字。這個和你使用沒有放到變量中去的字符串'\n'或數字'80'類似。

創(chuàng)建規(guī)則 2

[ ITEMS ] 創(chuàng)建了一個新的、匿名的數組,并返回一個指向這個數組的'引用'。 { ITEMS } 創(chuàng)建了一個新的、匿名的哈希,并返回那個哈希的一個'引用'。

    $aref = [ 1, "foo", undef, 13 ];  
    # $aref 保存了這個數組的'引用'
    $href = { APR =>; 4, AUG =>; 8 };   
    # $href 保存了這個哈希的'引用'
從規(guī)則 2 中得到的'引用'和從規(guī)則 1 中得到的'引用'是同一種類型的:

        # 這里:
        $aref = [ 1, 2, 3 ];
        # 和上面一樣:
        @array = (1, 2, 3);
        $aref = \@array;
前面一種方法是后面兩行的縮寫,除了第一種方法沒有創(chuàng)建一個多余的數組變量@array。

如果你只是編寫符號 [], 你將得到一個新的、空匿名數組。如果你使用符號 {},就能得到一個新的、空匿名哈希。


使用引用
當你創(chuàng)建了一個'引用'后,你可以對它做什么操作呢?它是標量,你可以象處理任何標量一樣保存和取回它。除此之外,還有兩種使用方法:


使用規(guī)則 1
你可以始終用一個帶有大括號的數組'引用',來替換一個數組的名字。例如,用 @{$aref} 代替 @array。

下面是一個用法的一些例子:

數組:

        @a              @{$aref}                一個數組
        reverse @a      reverse @{$aref}        對一個數組做倒序排序
        $a[3]           ${$aref}[3]             數組中的一個成員
        $a[3] = 17;     ${$aref}[3] = 17        對一個成員賦值
上面每行中,兩個表達式實現的是同一種功能。左邊那個是對數組@a操作,右邊那個是對'引用'$aref所指向的數組操作。它們對數組產生相同的作用。

使用哈希的'引用'和數組的'引用'完全一樣。

        %h              %{$href}              一個哈希
        keys %h         keys %{$href}         從哈希中將鍵取出來
        $h{'red'}       ${$href}{'red'}       哈希中的一個成員
        $h{'red'} = 17  ${$href}{'red'} = 17  對一個成員賦值
你對一個'引用'無論想做什么,使用規(guī)則 1 已經告訴你怎么做了。 你只要象使用常規(guī)的數組或哈希一樣編寫Perl代碼,然后把數組或哈希的名字用 {$reference}來替代!斘抑挥幸粋'引用'時,怎么來遍歷整個數組?’你這樣寫:

        for my $element (@array) {
           ...
        }
接著用'引用'替代數組名@array:

        for my $element (@{$aref}) {
           ...
        }
‘怎當我只有一個'引用'時,怎么來打印一個哈希的內容?’先寫一個打印整個哈希的代碼:

        for my $key (keys %hash) {
          print "$key =>; $hash{$key}\n";
        }
然后用'引用'代替那個哈希的名字:

        for my $key (keys %{$href}) {
          print "$key =>; ${$href}{$key}\n";
        }

使用規(guī)則 2
使用規(guī)則 1 是你真正需要的,因為它告訴了你怎么來處理一個'引用',而它對幾乎任何的'引用'都有效。但是我們通常做的事情只是和數組或哈希中的一個成員有關,使用規(guī)則 1 卻是很笨重的方法,所以還有簡單的方法。

${$aref}[3] 太難閱讀,所以我們這樣寫 $aref->;[3]。

${$href}{red} 寫的太笨重, 所以我們這樣寫 $href->;{red}。

如果 $aref 保存的是一個數組的'引用',那么 $aref->;[3] 就是這個數組的第四個成員。不要和 $aref[3] 相混淆,這個代表的是一個完全不同的數組的第四個成員,這個迷惑的數組是@aref。 變量 $aref 和 @aref 是完全不相關的,就像 $item 和 @item 一樣。

同樣的, $href->;{'red'} 是哈希'引用' 的變量$href的一部分,甚至這是一個沒有名字的哈希。而$href{'red'} 是另一個容易混淆的命名哈希 %href 的一部分。很容易忘記寫上符號' ->;',如果出現這種情況,當你的程序從一個你不想取數據的數組和哈希中取出了成員,你會得到奇怪的計算結果。


例子
讓我們來看一個例子:

首先,記住 [1, 2, 3] 創(chuàng)建了一個匿名數組,包含了 (1, 2, 3),然后返回一個數組的'引用'。

現在想一下:

        @a = ( [1, 2, 3],
               [4, 5, 6],
               [7, 8, 9]
             );
@a 是一個擁有三個成員的數組,每一個成員是另一個數組的'引用'。

$a[1] 是其中的一個'引用'。它指向一個數組,這個數組包含了(4, 5, 6),因為這是一個數組的'引用',使用規(guī)則 2 告訴我們可以這樣寫 $a[1]->;[2],用來取得這個數組的第三個成員。  $a[1]->;[2] 值是6。 同樣的,$a[0]->;[1] 值是 2。這里我們就像在使用一個二維數組;你可以是用 $a[ROW]->;[COLUMN] 來取得或設置數組中任何一行任何一列中的成員。

這些符號看起來還是有些麻煩,所以還有更加簡單的用法:


箭頭符號規(guī)則
在兩個下標之間的箭頭是可選的。

我們可以用這個寫法$a[1][2]來代替$a[1]->;[2];它們是相同的。相對于$a[0]->;[1] = 23,我們這樣寫$a[0][1] = 23;它們也是相同的。

現在它們看起來真的象二維數組了!

你可以發(fā)現為什么箭頭這么重要。沒有它們,我們必須這樣寫${$a[1]}[2],而不是$a[1][2]。對于三維數組,它們使我們可以簡單地寫成$x[2][3][5]而不是寫成難讀的${${$x[2]}[3]}[5]方式。



--------------------------------------------------------------------------------

解決辦法
下面是前面提出來的問題的解決方法,就是關于城市和國家名稱的重新格式化。

    1   my %table;
    2   while (<> {
    3    chomp;
    4     my ($city, $country) = split /, /;
    5     $table{$country} = [] unless exists $table{$country};
    6     push @{$table{$country}}, $city;
    7   }
    8   foreach $country (sort keys %table) {
    9     print "$country: ";
   10     my @cities = @{$table{$country}};
   11     print join ', ', sort @cities;
   12     print ".\n";
   13   }
這個程序分成兩部分: 第 2--7 行完成數據的輸入和數據結構的創(chuàng)建。 第 8-13 行分析這個數據并打印報告。我們設置了一個哈希 %table,它的鍵是國家名稱,它的健值是這個國家名稱對應的城市名的數組的'引用'。這個數據結構看起來如下:

           %table
        +-------+---+   
        |       |   |   +-----------+--------+
        |Germany| *---->;| Frankfurt | Berlin |
        |       |   |   +-----------+--------+
        +-------+---+
        |       |   |   +----------+
        |Finland| *---->;| Helsinki |
        |       |   |   +----------+
        +-------+---+
        |       |   |   +---------+------------+----------+
        |  USA  | *---->;| Chicago | Washington | New York |
        |       |   |   +---------+------------+----------+
        +-------+---+
我們先來分析輸出部分。假設我們已經擁有了這個結構,那么我們怎么來輸出呢?

    8   foreach $country (sort keys %table) {
    9     print "$country: ";
   10     my @cities = @{$table{$country}};
   11     print join ', ', sort @cities;
   12     print ".\n";
   13   }
%table是一個普通的哈希,我們從它這里可以取得一列鍵,對鍵進行排序,并遍歷所有的鍵。這里唯一使用'引用'的是第10行。$table{$country} 查看了哈希中的鍵$country并取得它的值。這個健值是對應國家中的城市數組的'引用'。 使用規(guī)則 1 告訴我們可以通過使用 @{$table{$country}}來恢復整個數組。第10行就象

        @cities = @array;
不同的是這里的數組的名字被'引用' {$table{$country}}所替代。符號 @ 告訴Perl去獲取整個數組。得到了城市的列表后,我們照樣對其進行排序,合并城市名,并打印出來。

第2-7行負責創(chuàng)建數據結構,如下:

    2   while (<> {
    3    chomp;
    4     my ($city, $country) = split /, /;
    5     $table{$country} = [] unless exists $table{$country};
    6     push @{$table{$country}}, $city;
    7   }
第 2-4 行獲取城市和國家的名稱。第5行查看這個國家名稱是不是已經作為一個鍵存放在哈希里面了,如果沒有,程序就使用符號[] (創(chuàng)建規(guī)則 2)創(chuàng)建一個新的、空的匿名數組,同時把一個指向這個匿名數組的'引用'作為健值放到哈希里面去了。

第6行將城市名放到對應的數組里面。$table{$country} 現在保存了一個'引用',它指向所對應的國家的城市的數組。第6行就象

        push @array, $city;
不同的是這里的數組名被{$table{$country}}所替代。 命令 push 將城市名加到這個'引用'指向數組的最后。

這里有一個要點被我忽略了。第5行是不需要的。我們可以取掉它。

    2   while (<> {
    3    chomp;
    4     my ($city, $country) = split /, /;
    5   ####  $table{$country} = [] unless exists $table{$country};
    6     push @{$table{$country}}, $city;
    7   }
如果在哈希 %table 中已經有這個國家名 $country的記錄,那么,加不加第5行沒有任何區(qū)別。第6行會自己定位到$table{$country}這個'引用'指向的數組,把值 $city 放到數組中去。但是如果在%table中沒有那個鍵,比如Greece,那么它會怎么辦呢?

這是Perl,它會自己準確地完成工作。你想把一個Athens賦值給一個不存在地數組,那么Perl會幫助你創(chuàng)建一個新的、空的匿名數組,將它放到哈希%table里面去,然后把值 Athens 放到這個數組中。這個被稱為'自動生成' --讓事物自己自動產生出來。 Perl 發(fā)現在哈希里面沒有這個鍵,就自動地創(chuàng)建了一個新的哈希記錄。 Perl 發(fā)現你想要使用數組作為哈希的健值,它就自動創(chuàng)建一個匿名的空數組,并將指向這個數組的'引用'放到那個哈希中去。一般, Perl 創(chuàng)建的數組只有一個成員大小,用于保存這個新的城市名。



--------------------------------------------------------------------------------

其他集錦
我承諾以10%的細節(jié)來使你得到90%的好處,那就意味著我跳過了90%的知識的細節(jié),F在來看一下其中的重要的部分,這個比閱讀手冊 the perlref manpage 要容易得多,手冊討論了100%的細節(jié)。

手冊 the perlref manpage中的一些集錦:

你可以對任何東西創(chuàng)建'引用',包括標量,函數和其他的引用。

在 使用規(guī)則 1 中,當大括號里面是一個象$aref這樣的標量變量時,你可以省略掉這個大括號。例如, @$aref 和 @{$aref}是一樣的,$$aref[1] 和 ${$aref}[1]是一樣的。 如果你是初學者,建議你還是養(yǎng)成加上大括號的習慣。

下面的操作不會copy '引用'指向的數組:
        $aref2 = $aref1;
你將得到兩個'引用',它們都指向同一個數組。如果你修改了$aref1->;[23]的值,那么你查看變量$aref2->;[23]時,它也相應地變了。

要copy這個數組,你需要這樣

        $aref2 = [@{$aref1}];
使用符號 [...] 來創(chuàng)建一個新的匿名數組, 而且這個新的數組的'引用'被賦值給了$aref2 。 這個新的數組用'引用'$aref1所指向的數組的內容來初始化。

同樣的,要copy一個匿名哈希,你需要這樣

        $href2 = {%{$href1}};

如果要判斷一個變量保存的內容是不是'引用',使用函數ref 。如果它的參數是'引用',返回的值是'真'。實際上,它做得更好:如果是一個哈希的引用,它返回'HASH',如果是一個數組的引用,那么就返回'ARRAY'。

如果你想像字符串一樣使用'引用'的話,你得到的字符串就像
        ARRAY(0x80f5dec)   or    HASH(0x826afc0)
如果看到一個像這樣的字符串,你應該知道你錯誤地輸出了一個'引用'。

這種顯示方式的另一個作用是你可以用eq來比較兩個'引用',看它們是不是指向相同的東西。(你通?梢允褂 == 來比較,因為它更會)


你可以像使用'引用'一樣來使用一個字符串。如果你使用"foo"作為一個數組的'引用',它就是指向數組 @foo的一個引用。這被稱為'軟引用'或‘符號引用 '。 使用申明 use strict 'refs' 可以取消這個功能,如果你不小心使用了它,會導致各種可能的錯誤。

你可能更喜歡查看 the perllol manpage,而不是手冊 the perlref manpage;它詳細地討論了列表的列表和多緯數組。然后,你可以繼續(xù)學習手冊 the perldsc manpage;它是數據結構的Cookbook, 它提供了處理哈希的數組,數組的哈希,以及其他數據結構的方法。



--------------------------------------------------------------------------------

摘要
每個人都需要復合的數據結構,在Perl中我們的辦法是通過'引用'來實現。這里有四個重要的操作'引用'的規(guī)則:兩個用于創(chuàng)建'引用',另外兩個用于使用'引用'。 一旦掌握了這些規(guī)則,你可以用'引用'來處理很多重要的事情。



--------------------------------------------------------------------------------

感謝
作者: Mark Jason Dominus, Plover Systems (mjd-perl-ref+@plover.com)

這篇文章最初出現在 The Perl Journal ( http://www.tpj.com/ ) volume 3, #2. 同意再版.

原來的標題是 Understand References Today.


發(fā)布要求
Copyright 1998 The Perl Journal.

This documentation is free; you can redistribute it and/or modify it under the same terms as Perl itself.

Irrespective of its distribution, all code examples in these files are hereby placed into the public domain. You are permitted and encouraged to use this code in your own programs for fun or for profit as you see fit. A simple comment in the code giving credit would be courteous but is not required.

perlreftut - Mark's very short tutorial about references

論壇徽章:
0
2 [報告]
發(fā)表于 2005-03-04 11:32 |只看該作者

一個perl 引用的資料

呵呵 謝謝

論壇徽章:
1
2015年辭舊歲徽章
日期:2015-03-03 16:54:15
3 [報告]
發(fā)表于 2005-03-04 21:07 |只看該作者

一個perl 引用的資料

不錯,不錯。
我正在整理 ActivePerl 的翻譯文檔,如果樓主同意的話,可以收藏到這里:
http://wiki.perlchina.org/main/show/ActivePerl+%E6%96%87%E6%A1%A3

論壇徽章:
0
4 [報告]
發(fā)表于 2005-03-06 21:08 |只看該作者

一個perl 引用的資料

同意啊,不過這里的格式不是很好,我可以發(fā)給你源于active perl 幫助中的html格式的文檔.

論壇徽章:
0
5 [報告]
發(fā)表于 2007-01-11 15:29 |只看該作者
寫的太好了。贊一個

論壇徽章:
78
雙子座
日期:2013-10-15 08:50:09天秤座
日期:2013-10-16 18:02:08白羊座
日期:2013-10-18 13:35:33天蝎座
日期:2013-10-18 13:37:06獅子座
日期:2013-10-18 13:40:31雙子座
日期:2013-10-22 13:58:42戌狗
日期:2013-10-22 18:50:04CU十二周年紀念徽章
日期:2013-10-24 15:41:34巨蟹座
日期:2013-10-24 17:14:56處女座
日期:2013-10-24 17:15:30雙子座
日期:2013-10-25 13:49:39午馬
日期:2013-10-28 15:02:15
6 [報告]
發(fā)表于 2009-07-15 13:48 |只看該作者
good  good

論壇徽章:
0
7 [報告]
發(fā)表于 2009-09-21 14:44 |只看該作者

非常感謝

我正在為一個程序犯愁,看了摟主的文章,茅塞頓開,太感謝了!

論壇徽章:
0
8 [報告]
發(fā)表于 2010-09-06 15:44 |只看該作者
真是不錯。

論壇徽章:
1
雙子座
日期:2013-11-06 17:18:01
9 [報告]
發(fā)表于 2011-01-19 16:27 |只看該作者
我個人覺得這個引用資料很不錯
如果對著C中的知識來看的話有相似處.剛接觸perl,看了這篇資料可以說引用方面就不用看其它的了.完全夠 了
謝謝分離

論壇徽章:
0
10 [報告]
發(fā)表于 2011-01-19 16:29 |只看該作者
嗯,這個說明比較深入系統(tǒng)。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP