Frage

Bis vor kurzem, ich habe mehrere Werte in unterschiedliche Hashes mit den gleichen Schlüssel zu speichern, wie folgt:

%boss = (
    "Allan"  => "George",
    "Bob"    => "George",
    "George" => "lisa" );

%status = (
    "Allan"  => "Contractor",
    "Bob"    => "Part-time",
    "George" => "Full-time" );

und dann kann ich Referenz $boss("Bob") und $status("Bob") aber dies wird unhandlich, wenn viele Eigenschaften gibt es jede Taste haben kann, und ich habe über das halten die Hashes synchron sorgen.

Gibt es einen besseren Weg, um mehrere Werte in einem Hash zum Speichern? Ich konnte die Werte speichern, wie

        "Bob" => "George:Part-time"

und zu demontieren dann die Saiten mit Split, aber es muss eine elegantere Art und Weise sein.

War es hilfreich?

Lösung

Dies ist der normale Weg, wie per Perldoc perldsc .

~> more test.pl
%chums = ( "Allan" => {"Boss" => "George", "Status" => "Contractor"},
           "Bob" => {"Boss" => "Peter", "Status" => "Part-time"} );

print $chums{"Allan"}{"Boss"}."\n";
print $chums{"Bob"}{"Boss"}."\n";
print $chums{"Bob"}{"Status"}."\n";
$chums{"Bob"}{"Wife"} = "Pam";
print $chums{"Bob"}{"Wife"}."\n";

~> perl test.pl
George
Peter
Part-time
Pam

Andere Tipps

Hashes von Hashes ist, was Sie ausdrücklich gefragt sind für. Es gibt ein Tutorial Stil Stück Dokumentation Teil der Dokumentation Perl, die diese umfasst: Datenstruktur Kochbuch Aber vielleicht sollten Sie erwägen, objektorientierte gehen. Dies ist eine Art klischee Beispiel für objektorientierte Programmierung Tutorials.

Wie wäre es etwa so:

#!/usr/bin/perl
package Employee;
use Moose;
has 'name' => ( is => 'rw', isa => 'Str' );

# should really use a Status class
has 'status' => ( is => 'rw', isa => 'Str' );

has 'superior' => (
  is      => 'rw',
  isa     => 'Employee',
  default => undef,
);

###############
package main;
use strict;
use warnings;

my %employees; # maybe use a class for this, too

$employees{George} = Employee->new(
  name   => 'George',
  status => 'Boss',
);

$employees{Allan} = Employee->new(
  name     => 'Allan',
  status   => 'Contractor',
  superior => $employees{George},
);

print $employees{Allan}->superior->name, "\n";

Hashes können andere Hashes oder Arrays enthalten. Wenn Sie Ihre Eigenschaften mit Namen beziehen möchten, speichern Sie sie als Hash pro Schlüssel, sonst speichert sie als Array pro Taste.

Es gibt eine Referenz für die Syntax .

my %employees = (
    "Allan" => { "Boss" => "George", "Status" => "Contractor" },
);

print $employees{"Allan"}{"Boss"}, "\n";

% chums = ( "Allan" => { "Boss" => "George", "Status" => "Auftragnehmer"},            "Bob" => { "Boss" => "Peter", "Status" => "Teilzeit"});

funktioniert gut, aber gibt es einen schnelleren Weg, um die Daten einzugeben?

Ich denke an so etwas wie

% chums = (QW, x) (Allan Boss George Der Status Auftragnehmer Bob Boss Peter-Status Teilzeit)

, wobei x = die Anzahl der Sekundärschlüssel nach dem Primärschlüssel, in diesem Fall x = 2, "Boss" und "Status"

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top