Schrift
[thread]11073[/thread]

Zugriff auf Elemete aus einer Referenz



<< >> 8 Einträge, 1 Seite
Duff
 2007-12-28 12:59
#104194 #104194
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Hallo,

ich habe mal wieder eine Frage zum Zugriff auf eine Referenz.

Und zwar gibt mir ein Dumper, der in einer Schleife aufgerufen wird, folgendes aus:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
$VAR1 = [ 
               'String',
               undef
];

$VAR1 = [ 
               'String',
               6
];
...


Bekomme es mal wieder nicht hin, auf den ersten bzw. auf den zweiten Wert zu zugreifen.
D'OH
Daniel
Linuxer
 2007-12-28 13:05
#104195 #104195
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Hi,

meinst Du so?

Code (perl): (dl )
1
2
3
4
5
6
7
my $ref = [
  [ qw( 1 2 ) ],
  [ qw( a b ) ],
];

print $ref->[0]->[1], $/;
print $ref->[1]->[1], $/;
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
Duff
 2007-12-28 13:13
#104197 #104197
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Ich habe in einer Subroutine zweite Werte, die ich in einem Array speicher.

Code: (dl )
my @sub_result=($wert1, $wert2);

Nun übergebe ich aus dieser Subroutine dass Ganze über return als Referenz.

Code: (dl )
1
2
3
$res=\@sub_result;

return $res;


Im Hautprogramm Rufe ich dann die Subroutine auf und erhalte als Rückgabewert $res.
Code: (dl )
1
2
$result=subroutine()
print Dumper($result);


Das print Dumper($result) ergibt dann die obere Ausgabe. Mache ich ein print "$result\n"; bekomme ich die Speicheradresse eines Arrays zurück.

Normalerweise sollte ich doch mit @{$result} den Inhalt des Arrays ausgegeben bekommen, oder nicht?
D'OH
Daniel
Struppi
 2007-12-28 13:18
#104199 #104199
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Was den Rückgabewert angeht kannst du das flexibel machen:

Code (perl): (dl )
1
2
3
4
sub mySub {
my @sub_result = ($wert1, $wert2);
return wantarray ? @sub_result : \@sub_result;
}


und ja, wenn du eine Arrayreferenz dereferenzierst kannst du mit print @$arr_ref; die Liste ausgeben. Aber deine obige Ausgabe zeigt das du ein AoA (array of Arrays) hast. Also musst du die einzelenen Einträge ebenfalls dereferenzieren.
Duff
 2007-12-28 13:29
#104201 #104201
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Bekomme immer die Fehlermeldung:
Can't use string ("") as an ARRAY ref while "strict refs" in use at ...

Verstehe ich ehrlich gesagt nicht wirklich. Weiß nicht, was falsch sein soll.

@Struppi: Wieso sollte ich den Rückgabewert ändern?
Bekomme immer Wert1 und eventuell auch Wert2 zurück, welcher aber auch undef sein könnte.
D'OH
Daniel
Struppi
 2007-12-28 14:21
#104207 #104207
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Du sollst nicht den Rückgabewert ändern, sondern du kannst mit obigen Konstrukt den Rückgabewert flexibler gestalten. Die Funktion erkennt ob du ein Array zurück haben möchtest oder nicht (wantarray).

Und warum du die Fehlermeldung erhälst läßt sich nicht sagen, da der code dazu fehlt.
Gast Gast
 2007-12-29 12:13
#104233 #104233
Struppi+2007-12-28 12:18:17--
...
Aber deine obige Ausgabe zeigt das du ein AoA (array of Arrays) hast. Also musst du die einzelenen Einträge ebenfalls dereferenzieren.

Das kann ich an der Ausgabe oben nicht erkennen.
Er bekommt immer Pairs von seiner Funktion zurück, auf einzelne Elemente zugreifen kannst du dann mittels -> Operator.
Code: (dl )
1
2
3
4
5
my $string = $result->[0];
my $num = $result->[1];

# oder:
my( $string, $num ) = @$result;

Wobei du bei 2 Rückgabewerten keine Referenzen brauchst.
Wenn du also deine Funktion bereits so angepasst hast, wie Struppi geschrieben hat, dann kannst du sie auch so aufrufen:
Code: (dl )
my( $string, $num ) = mySub();


MfG Horst
Struppi
 2007-12-30 02:34
#104255 #104255
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Stimmt, ich habe die Dumperausgabe falsch gedeutet.
<< >> 8 Einträge, 1 Seite



View all threads created 2007-12-28 12:59.