Thread hashref an sub und mehr (4 answers)
Opened by chmod777 at 2010-11-19 20:23

renee
 2010-11-19 20:53
#142895 #142895
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wenn ich Deine Frage richtig verstanden habe, geht das nicht. Du kannst nicht so etwas machen:

Code (perl): (dl )
1
2
3
4
5
6
my $hashref = {};
test( eins => 1, zwei => 2, $hashref );

sub test {
    my (%hash,$hashref) = @_;
}


Die Hashreferenz landet stringifiziert als Schlüssel im Hash. Was Du machen kannst, ist die Hashreferenz als erstes übergeben und dann so etwas machen:
Code (perl): (dl )
1
2
3
4
5
6
my $hashref = {};
test( $hashref, eins => 1, zwei => 2 );

sub test {
    my ($hashref,%hash) = @_;
}


Wenn Du mit Prototypen arbeiten kannst/willst geht auch das hier:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

sub test(\%$) {
    my ($param,$hashref) = @_;

    warn Dumper $param;
}

my %hash = (eins => 1, zwei => 2);
test( %hash, { hallo => 1 } );
Aber beachte: Du musst den Hash vorher definieren und dann den Hash als Parameter übergeben. Ansonsten meckert Perl rum. Und Du musst die Subroutine vor dem Aufruf definieren, sonst wirken die Prototypen nicht (und Perl meckert)

Wenn Du es unbedingt so machen möchtest/musst:
Code (perl): (dl )
test( eins => 1, zwei => 2, $hashref );


Dann kannst Du es auch so machen:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
test( eins => 1, zwei => 2, $hashref );

sub test {
    my $hashref;
    if ( ref $_[-1] eq 'HASH' ) {
        $hashref = pop @_;
    }

    my %hash = @_;
}


Edit: Ich würde Dir aber dazu raten, nur Hashreferenzen zu übergeben... Das macht Dir in Zukunft das Leben einfacher.
Last edited: 2010-11-19 20:54:19 +0100 (CET)
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/

View full thread hashref an sub und mehr