2017-12-30 50 views
-2

Ich versuche, diesen Hash zu drucken. Als key1 ist der array[0], key2 ist array[2] und $sum[0] ist der Wert. Aber das hat nicht funktioniert. Was mache ich falsch?Wie Array-Variable als Hash zuweisen?

@array=(10,45,20); 

@sum=($array[0]+$array[1]+$array[2]); 

%hash; 

$hash{$array[0]}{$array[2]}=$sum[0] 

Am Ende des Hashes Ich mag 10 : 75 auf den Bildschirm drucken.

+1

Bitte immer 'hinzuzufügen gegeben Verwenden Sie streng; Verwenden Sie Warnungen; 'zu Ihren Skripten, um häufige Fehler zu vermeiden. /// Was genau ist dein Problem?Sie haben einen Hash erstellt, der '{'10' => {'20' => 75}}' enthält. Was willst du stattdessen? – PerlDuck

+0

am Ende der Hashes Ich möchte 10: 75 auf den Bildschirm drucken, aber ich weiß nicht, wie man den Reference für diesen Hash geben .. –

+0

Warum verwenden Sie überhaupt einen 2-dimensionalen Hash? Warum nicht einfach '$ hash {$ array [0]} = $ sum [0]'? Das gibt '{' 10 '=> 75} '. – PerlDuck

Antwort

0

Aus der Beschreibung Sie @ikegami gab gegeben «mein Programm akzeptieren ...» I eine Datei erstellt, die die Daten haben würde:

data_1.txt: bis

john 10 45 20 
alex 30 15 12 
pete 23 45 10 21 
will 06 56 
bob 8 12 3 
lazy 

beachten Sie, dass nur die ersten beiden Linien entsprechen tatsächlich die Beschreibung, komme ich zurück, dass später.

sum.pl:

use strict; 
use warnings; 

use List::Util 'sum'; 

# get the two filenames it should work with 
# 
my $filename_1 = shift; 
my $filename_2 = shift; 

# be sure we read a file for most modern systems, UTF-8 
# 
open(my $file1, '<:encoding(UTF-8)', $filename_1) 
    or die "Can't open file: $filename_1"; 

# create the (empty) data structure 
# 
my %sums_and_names; 
# 
# the % in perl means you are talking about a hash, 
# use a sensible name instead of 'hash' 

# read line by line 
while (my $line = <$file1>) { 

    chomp $line; # get rid of the line endings 
    my ($name, @grades) = split ' ', $line; 
    # 
    # this is not strictly doing what you asked for, just more flexible 
    # 
    # split on ' ', a space character, splits on any asmount of (white) space 
    # your task said that there is one space. 
    # strictly, you could should split on//, the regular expression 
    # 
    # the first part will go into the variable $name, the rest in array @grades 
    # strictly you have only three grades so the following would do 
    # my ($name, $grade_1, $grade_2, $grade_3) = split//, $line; 

    my $sum = sum(@grades) // 'no grades'; 
    # 
    # since we now can handle any number of grades, not just three, we could 
    # have no grades at all and thus result in `undef` 
    # 
    # using the function sum0 would return the value 0 instead 
    # 
    # you'll get away with the `undef` using in a hash assignment, 
    # it will turn it into an empty string `''` 

=pod 

    $sums_and_names{foo}{bar} = [ 'baz', 'qux' ]; 

=cut 

    # 
    # here is where your task doesn't make sense 
    # i am guessing: 
    # 
    $sums_and_names{$sum}{$name} = \@grades; 
    # 
    # at least we have all the data from filename_1, and the sum of the grades 

} 

# please decide on what you want to print 

use Data::Dumper; 
print Dumper \%sums_and_names; 

und perl sum.pl data_1.txt data_2.txt laufen wird Ihnen etwas wie

Ausgang:

$VAR1 = { 
      'no grades' => { 
        'lazy' => [] 
         }, 
      '23' => { 
        'bob' => [ 
           '8', 
           '12', 
           '3' 
           ] 
        }, 
      '57' => { 
        'alex' => [ 
           '30', 
           '15', 
           '12' 
           ] 
        }, 
      '62' => { 
        'will' => [ 
           '06', 
           '56' 
           ] 
        }, 
      '75' => { 
        'john' => [ 
           '10', 
           '45', 
           '20' 
           ] 
        }, 
      '99' => { 
        'pete' => [ 
           '23', 
           '45', 
           '10', 
           '21' 
           ] 
        } 
     }; 

Bitte beachten Sie, dass ausschließlich der Block innerhalb der while-Schleife könnte geschrieben worden sein als:

chomp $line; 
    my ($name, $grade_1, $grade_2, $grade_3) = split//, $line; 
    $sum = $grade_1 + $grade_2 + $grade_3; 
    $sums_and_names{$sum}{$name} = [ $grade_1, $grade_2, $grade_3 ]; 

aber ich zitiere aus @Borodin:

Und während ich bin sicher, dass Sie als etwas allgemeinere wollen, haben Sie wirklich nicht genug Informationen

+0

Sie verwenden nicht $ filename_2. Ich denke nicht, dass es einen Unterschied macht.Es ist völlig unklar, welche Datenstruktur das OP wirklich will und auch seine Kommentare helfen nicht. Ich denke zum Beispiel, dass die Struktur, nach der er fragt, '$ sums_and_names {$ name} {$ sum}' (Schlüssel getauscht) ist. Wir wissen es einfach nicht. Er sollte die gewünschte Ausgabe zeigen (in einem Data :: Dumper oder JSON Format), aber das lehnt er ab. – PerlDuck

+0

natürlich weiß ich, dass ich '$ filename_2' nicht verwendet habe, aber das ist es, was in seiner letzten Beschreibung gesagt wurde" ... akzeptiere zwei unsortierte Dateien. " - Ich habe es absichtlich dort gelassen und versucht zu zeigen, dass es eine schlecht beschriebene Frage ist und dass das OP neu überdenken sollte, wie er es das nächste Mal fragt. --- Ich könnte tatsächlich einige Überprüfung hinzugefügt haben, dass man in zwei Dateinamen übergeben hat – vanHoesel

+0

ja, das ist Arbeit mein Dokument genau so mit.Leider konnte ich den Code nicht teilen, weil ich nicht die Erlaubnis dafür haben konnte.Ich konnte nur nicht verstehe nicht, was ich falsch mache und mit deinem Beispiel habe ich es verstanden. Danke. Ich gab Hash-Referenzen keinen Wert. –

0
  • Verwenden Sie immer use strict; use warnings qw(all); !!!
  • Es gibt nur eine Summe (zu einer Zeit), also brauchen Sie kein Array.
  • Es ist kein Hash-Hash erforderlich; Ein einfacher Hash wird ausreichen.

Korrigiert:

use strict; 
use warnings qw(all); 

use List::Util qw(sum); 


my %hash; 
while (...) { 
    my @nums = ...; 
    $hash{ $nums[0] } = sum(@nums); 
} 

for (sort { $a <=> $b } keys(%hash)) { 
    print("$_: $hash{$_}\n"); 
} 
+0

danke für Interesse, aber ich habe bereits mit einem Schlüssel auch ich möchte mit zwei Schlüssel erstellen .. Ihr Code nur einen Schlüssel .. –

+0

Wie es sollte. Es hat keinen Sinn, eine kompliziertere Datenstruktur zu erstellen als nötig. – ikegami

+0

chris : HASH (0x5581f6193078) meine Ausgabe scheint so, dass ich das gleiche schreibe, warum bekomme ich das Hash-Ergebnis .. –

2

Sie

eingestellt haben
$hash{$array[0]}{$array[2]} = $sum[0] 

, die mit den angegebenen Werten ist

$hash{10}{20} = 75 

Wenn Sie 10 : 75 aus dem Hash Sie drucken möchten, dann muss

schreiben
printf "%d : %d\n",10, $hash{10}{20} 

Und während ich bin sicher, dass Sie als etwas allgemeinere wollen, haben Sie wirklich nicht genug Informationen

+0

Ja, ich kann das machen, aber ich möchte das für große Dateien verwenden, damit ich keine Hashes schreiben kann, muss ich wie array [1] schreiben und array [2] für Schlüssel ... wie kann ich das machen Das.. ? –

+1

denke, dass ich eine Datei, die chris 10 34 56 Werte enthält. Und ich möchte nehmen tehm als Array dann machen zwei dimensinol Hash mit zwei Schlüssel. Als chris = erster Schlüssel und Summe der Zahlen = zweiter Schlüssel dann möchte ich print chris = Summe der Baumzahlen. –

+0

@Fatih: Ja, ich habe mir gedacht, dass du mehr als eine Datenzeile hast, aber dein Beispiel ist zu trivial. Wenn Sie nur eine Zeile zeigen, können wir nicht sehen, wie sie skaliert werden soll. Bitte zeigen Sie mehrere weitere Datenzeilen zusammen mit der gewünschten Ausgabe an. Wenn der Sendeschlüssel 20 niemals verwendet wird, gibt es keinen Grund, ihn im Hash zu speichern. – Borodin

Verwandte Themen