2011-03-31 32 views
1

我有一個將數組存儲爲實例變量的對象。由於Perl似乎不支持這一點,我必須將引用存儲到數組中。但是,我無法弄清楚如何在創建這些數組後再進行變異。這些方法似乎只會改變本地副本。 (目前,在addOwnedFile()的末尾,對象數據保持不變)。Perl中的數組訪問器方法

sub new { 
    my ($class) = @_; 
    my @owned_files =(); 
    my @shared_files =(); 

    my $self = { 

     #$[0] is the class 
     _name => $_[1], 
     _owned_files => \[], 
     _shared_files => \[],   
    }; 
    bless $self, $class; 

    return $self; 
    } 




#Add a file to the list of files that a user owns 
sub addOwnedFile { 
    my ($self, $file) = @_; 
     my $ref = $self -> {_owned_files}; 
     my @array = @$ref; 

     push(@array, $file); 

     push(@array, "something"); 

     push(@{$self->{_owned_files}}, "something else"); 

     $self->{_owned_files} = \@array; 
} 
+1

閱讀[perldoc perlref](http://perldoc.perl.org/perlref.html)和[perldoc perlreftut](http://perldoc.perl.org/perlreftut.html) – 2011-03-31 02:15:25

回答

8

您發佈的代碼觸發運行「不是一個數組引用...」錯誤。原因是設置_owned_files\[]這不是數組引用,而是對數組引用的引用。從兩個數組屬性中刪除\

因爲這樣,我們可以解決下一個問題。 @array是由對象持有的匿名數組的副本。你的前兩個push es是複製,最後一個是保存的數組。然後,通過將其替換爲對副本的引用來重新觸發所保存的數組。最好只通過參考與原始數組一起工作。下面的任一會的工作:

push @$ref, 'something'; 
push @{$self->{_owned_files}}, 'something'; 

,並在年底下降了

$self->{_owned_files} = \@array; 

sub new { 
    my $class = shift; 
    my $name = shift; 
    my $self = { 
     _name   => $name, 
     _owned_files => [], 
     _shared_files => [], 
    }; 
    return bless $self, $class; 
} 

sub addOwnedFile { 
    my ($self, $file) = @_; 
    push @{$self->{_shared_files}}, $file; 
} 
0

我相當肯定你在

my $self = { 
    #$[0] is the class 
    _name => $_[1], 
    _owned_files => \[], 
    _shared_files => \[],   
}; 

部分的問題。 _owned_file=> \[]不會創建和數組引用,而是對數組引用的引用。而你想要的是_owned_files => []。共享文件相同。

+0

嗯,它不似乎工作,與[],\()或\ @ owned_arrays。我也嘗試過@ @ ref「something」。 – chimeracoder 2011-03-31 01:26:13