2012-12-28 49 views
1

好了,所以它很容易地創建一個指向數組的參考...類型團的別名

my @a; 
my $b=\@a; 
#can now reference the same list of scalars from either @$b or @a 

但我怎麼能做到這一點的反向?例如:

my $a=[1..4]; 
my @b; 
#some magic happens here and now @b is an alias for @$a 
@b=(6..10); 
print "@$a\n"; #should print "6 7 8 9 10" 

我認爲這將通過typeglobs發生,但那些只是逃避我。想法?

此外,對散列以及數組做同樣的處理也不錯。

編輯:這似乎是工作,但它的一點點缺憾,因爲它只是複製了匿名數組元素的「別名」,然後再點自己的數組:

my @[email protected]$a; 
$a=\@b; 

更好的想法?

回答

5

兩種方式:

  1. 水珠aliasi ng

    Perl調用「type glob」或簡稱爲「glob」,它的符號表條目數據結構。可以將此數據結構中的條目設置爲引用來命名該引用。

    *B = $A;  # Sets the array slot of "B", @B. 
    say for @B; 
    

    注意,一個常問Perl來使用包變量(通過使用use strict;)禁止我們。讓您可以在使用

    1. say for $this::package::B;
    2. our @B; say for @B;

  2. Data::Alias

    alias my @B = @$A; 
    say for @B; 
    
+0

基本上我偶然發現了什麼,但是你也添加了更多! +1 – mswanberg

0

$ a和@a不是一回事。 $ a,因爲您首先分配它是對匿名數組的一個參考 。它與@a沒有任何關係,它是一個數組(不是引用)。

$ b = \ @a#$ b擁有@a的引用,但不包含$ a。

$ a,@a,%a都是不同的變量。因此,如果您有

my @a =(1,2,3,4);

然後你聲明

my $ a;

$ a不包含對@a的引用;

變量通過它們的類型保存在符號表中;標量,哈希,數組等。 這樣你就可以有$ a,@a,%a,& ......並且不會相互衝突。

的一點是,

#some magic happens here and now @b is an alias for @$a 

不會發生。它仍然指向存儲@a的內存區域,其中 與存儲$ a的區域不同。

+0

我擔心你完全錯過了我的問題。我知道$ a和@a是不同的東西。那不是重點。我知道如何引用一個數組並將其存儲爲標量,如$ b = \ @ a。我的問題是以相反的順序進行聲明......我想將@a放在與@ $ b相同的內存位置之上,這樣我就可以在這兩個方法的內存位置訪問該數組。顯然,@a = @ $ b不會像拷貝數組元素那樣做。 \ @ a = $ b無法正常工作......「無法修改標量賦值中的引用構造函數......」作爲錯誤狀態。 – mswanberg

+0

僅供參考,我的「一些魔術發生在這裏」並不是Perl的一個參考......它是對「告訴我什麼命令/代碼放在這裏以使下列事情發生」的引用。 – mswanberg

+0

好的。那麼你需要在你的問題中說清楚。根據你寫的內容,我無法知道。 – jmcneirney

3

我想我明白了...

my $a=[1..4]; 
our @b; 
*b=$a; 
print "@b\n"; 
@b=(6..10); 
print "@$a\n"; 

打印:

1 2 3 4 
6 7 8 9 10 

「我們」仍是一個謎給我...我想我有一些讀數做...

+0

這可能會有所幫助:http:// stackoverflow。com/questions/4623556/symbol-table-deletion-entries-question – creaktive

4

perl程序中的所有變量都存儲在命名空間中。 有兩種類型的命名空間:

  1. 符號表。它是一個全局散列,它存儲全局變量的記錄。
  2. 詞彙範圍。它是存儲的匿名臨時存儲器,不是特定的符號表,但它被附加到程序的 塊中。它們存儲變量,我們在該程序塊中只能看到 。

Typeglobs用於定義符號表的記錄(一個變量,一個數組等),但不包括詞法表 範圍。所以,當你使用這部分代碼:

my @b; 
*b = $a; 

你會得到它:

Name "main::b" used only once: 

這是說我們該記錄主:: B不是在美國一個符號表中定義,但我們可以使用修飾符「我們的」來做到這一點。因此,當你寫了這麼:

our @b; 
*b = $a; 

,我們可以得到一個有用的結果對我們來說,因爲* 30b存儲在一個符號表中,我們可以使用運算符*類型團。