Schrift
[thread]8601[/thread]

return Tied Array: wer hat eine Idee?



<< >> 1 Eintrag, 1 Seite
Strat
 2006-12-24 14:40
#72723 #72723
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
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:
Code: (dl )
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:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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.
Code: (dl )
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:
Code: (dl )
1
2
3
4
5
foreach my $person ( $self->persons_from_PerlCommunity_de ) {
if( $person->can( 'CelebrateXmas' ) {
$person->WishHappyXmas;
}
}
\n\n

<!--EDIT|Strat|1166964152-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< >> 1 Eintrag, 1 Seite



View all threads created 2006-12-24 14:40.