Hallo Leute,
ich suche nach einem Weg, wie ich ein tied array aus einer Subroutine zurueckgeben kann und es ausserhalb als
Array (nicht Arrayreferenz) verwenden kann.
Kurzer Beispielcode mit Arrayreferenz:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#! /usr/bin/perl
use warnings;
use strict;
my $array = TieVariable();
for (0..5) {
print "$_: $array->[$_]\n";
} # for
$array->[6] = 1000;
untie $array;
# ------------------------------------------------------------
sub TieVariable {
tie my @array, 'Tie::Excel::Array';
$array[$_] = 5 * $_ for 0..5;
return \@array;
} # TieVariable
# ============================================================
package Tie::Excel::Array;
sub TIEARRAY {
my( $class ) = @_;
return bless [], $class;
} # TIEARRAY
# ------------------------------------------------------------
sub STORE {
my( $self, $index, $value ) = @_;
warn "STORE: \$self->[$index] = $value;\n";
$self->[$index] = $value;
} # STORE
# ------------------------------------------------------------
sub FETCH {
my( $self, $index ) = @_;
warn "FETCH: \$self->[$index] = $self->[$index];\n";
return $self->[$index];
} # STORE
# ------------------------------------------------------------
sub FETCHSIZE {
my( $self ) = @_;
return $#$self;
} # FETCHSIZE
# ------------------------------------------------------------
sub UNTIE {
my( $self ) = @_;
warn "UNTIE\n";
} # UNTIE
Der funktioniert auch wie gewuenscht; nur wenn ich in TieVariable keine Referenz zurueckgeben lasse, sondern ein Array:
my @array = TieVariable();
for (0..5) {
print "$_: $array[$_]\n";
} # for
$array[6] = 1000;
untie @array;
# ------------------------------------------------------------
sub TieVariable {
tie my @array, 'Tie::Excel::Array';
$array[$_] = 5 * $_ for 0..5;
return @array;
} # TieVariable
dann geht durch das return @array natuerlich die Bindung verloren, und ich arbeite mit einem ganz normalen Array.
Mir fallen die folgenden Moeglichkeiten ein, wie man im Hauptprogramm trotzdem mit einem Array arbeiten kann, aber eine ist haesslicher als die andere:
1. @array als globale Variable verwenden und nicht zurueckgeben (will ich vermeiden, weil ich dann nur eine tied Variable pro Programmlauf verwenden kann, und in der Subroutine Infos ueber den Namen der Variable im Hauptprogramm haben muss)
2. Irgendeine packagevariable verwenden und mit einem alias arbeiten, z.B.
our @F; *F = \@MyPackage::Array1;
aber auch hier ist es haesslich, mehrere Variablen verwenden zu koennen, vor allem, weil ich dann sowohl in der Sub als auch im Hauptprogramm symbolische Referenzen benoetige.
3. Als Arrayreferenz arbeiten und einen Sourcefilter schreiben, der eine Autoreferenzierung fuer diese tied arrays macht... *schuettel*
4. Den Tie ausserhalb der TieVariable machen; dann habe ich jedoch dasselbe Problem wieder, wenn @array unreferenziert an eine Sub uebergeben wird.
Wer hat eine Idee, wie ich das (moeglichst sauber) hinbekomme? Die Sub TieVariable kann meinetwegen maximal komplex werden, nur das ausserhalb des Hauptprogramms sollte moeglichst einfach werden.
PS:
foreach my $person ( $self->persons_from_PerlCommunity_de ) {
if( $person->can( 'CelebrateXmas' ) {
$person->WishHappyXmas;
}
}
\n\n
<!--EDIT|Strat|1166964152-->