8 Stimmen

Unterschied zwischen %hash und \%hash als Parameter?

Ich versuche gerade, Perl zu lernen, und mir ist aufgefallen, dass die Leute manchmal Variablen "escapen", wenn sie sie als Parameter übergeben. Ich bemerkte dies zuerst mit SQL::Abstract:

my %hash = (
  'foo' => 'bar'
);
$db->insert('table', \%hash);

Als ich nun nach einem "print_r" (PHP) Äquivalent in Perl suchte und sah, wie Leute Data::Dumper empfahlen, konnte ich nicht verstehen, warum die Leute denken, dass sie gleichwertig sind, bis ich ein Beispiel sah, das print Dumper(\%hash); anstelle von print Dumper(%hash); .

Dies:

my %hash = (
  key1 => 'value1',
  key2 => 'value2'
);
print Dumper(%hash);

Dies wird ausgegeben:

$VAR1 = 'key2';
$VAR2 = 'value2';
$VAR3 = 'key1';
$VAR4 = 'value1';

Aber print Dumper(\%hash); gibt dies aus:

$VAR1 = {
          'key2' => 'value2',
          'key1' => 'value1'
        };

Kann mir jemand erklären, was das genau ist und was da passiert? Ich kann es in meinem Perl-Buch nicht finden und weiß nicht einmal, wonach ich bei Google suchen soll. Danke!

19voto

Jonathan Leffler Punkte 694013

Ausleihen von Ether Kommentar - sehen Sie sich die Perl Referenzen Tutorial und später bei Handbuch Perl-Referenzen in der Sprachspezifikation. Oder verwenden Sie perldoc perlreftut y perldoc perlref in der Befehlszeile.


Wenn Sie die %hash übergibt Perl eine möglicherweise große Anzahl von Elementen an die aufgerufene Funktion, die den Schlüssel/Wert-Paaren entsprechen.

Wenn Sie die \%hash übergibt Perl einen Verweis auf einen Hash - im Wesentlichen die Adresse des Hashs.

Zum Beispiel:

my %hash = ( Key1 => "Value1", Key2 => "Value2" );
sub counter
{
    printf "Count: %d\n", scalar(@_);
}
counter(%hash);
counter(\%hash);

die erzeugt:

Count: 4
Count: 1

Es gibt mehrere Möglichkeiten, um an die Daten zu gelangen:

sub hashref
{
    my($ref) = @_;
    foreach my $key (keys %{$ref})
    {
         print "$key: $ref->{$key}\n";
    }
}

sub hashnonref
{
    my(%hash) = @_;
    foreach my $key (keys %hash)
    {
        print "$key: $hash{$key}\n";
    }
}

sub hashasarray
{
    my(@array) = @_;
    foreach my $value (@array)
    {
         print "Value: $value\n";
    }
}

hashref(\%hash);   # Same data as before
print "\n";
hashnonref(%hash);
hashasarray(%hash);

Zusätzliche Leistung:

Key2: Value2
Key1: Value1

Key1: Value1
Key2: Value2
Value: Key2
Value: Value2
Value: Key1
Value: Value1

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X