2010-07-14 16 views
19

Wie initialisiere ich ein Array auf 0?Array-Initialisierung in Perl

Ich habe das versucht.

my @arr =(); 

Aber es wirft mir immer eine Warnung, „Verwendung von nicht initialisierten Wert“. Ich kenne die Größe des Arrays vorher nicht. Ich fülle es dynamisch. Ich dachte, das obige Stück Code sollte es auf 0 initialisieren.

Wie mache ich das?

+5

Zeigen Sie uns den Code, mit dem Sie Probleme haben. * Warum * brauchst du es auf 0 gesetzt? [XY-Problem] (http://www.perlmonks.org/?node=XY%20problem) – Daenyth

+0

Es ist etwas Ähnliches. Ich habe ein anderes Array mit Zahlen wie [0,0,0,1,2,2,3,3,3,4] jetzt muss ich die Anzahl von 0,1,2,3,4 zählen also werde ich ein anderes Array verwenden ... und die Zählung im angegebenen Index speichern. so muss ich arr [0] = 3 arr [1] = 1 arr [2] = 2 arr [3] = 3 arr [4] = 4 so wie und wann I stoßen ein Element I do ... arr [i] = arr [i] + 1; dafür muss ich mit Elementen beginnen, die mit 0 initialisiert wurden. Der obige Code funktioniert. Aber es wirft auch eine Warnung auf. – jerrygo

+1

Sie können $ arr [i] ++ anstelle von $ arr [i] = $ arr [i] + 1; Auch wenn Ihr Array leer ist, wird $ arr [i] ++ immer noch $ arr [i] auf 1 setzen; – MkV

Antwort

45

Wenn ich Sie verstehe, brauchen Sie vielleicht kein Array von Nullen; Sie benötigen einen Hash. Die Hash-Schlüssel werden die Werte in der anderen Anordnung sein und die Hash-Werte wird die Anzahl der Male der Wert in dem anderen Array vorhanden sein:

use strict; 
use warnings; 

my @other_array = (0,0,0,1,2,2,3,3,3,4); 
my %tallies; 
$tallies{$_} ++ for @other_array; 

print "$_ => $tallies{$_}\n" for sort {$a <=> $b} keys %tallies;  

Ausgang:

0 => 3 
1 => 1 
2 => 2 
3 => 3 
4 => 1 

Ihre Frage zu beantworten, mehr direkt, ein Array mit einem Bündel von Nullen aufgefüllt zu erstellen, können Sie die Technik, die in diesen beiden Beispielen verwenden:

my @zeroes = (0) x 5;   # (0,0,0,0,0) 

my @zeroes = (0) x @other_array; # A zero for each item in @other_array. 
           # This works because in scalar context 
           # an array evaluates to its size. 
+0

Danke. Das ist erstaunlich. Aber immer noch wundern, warum kann ich Array-Elemente auf 0 initialisiert haben, ohne Verwendung von Hash. Das Problem ist, es funktioniert nur, aber gibt mir eine Warnung vor dem Zugriff auf einen nicht initialisierten Wert. – jerrygo

+1

@jerrygo: Benutzt du zufällig eine alte Version von Perl? Dieser Code sollte Sie nicht warnen. – Ether

+0

Vielen Dank. Es hat das Problem gelöst. :) – jerrygo

15

Was meinen Sie mit "initialisieren Sie ein Array auf Null"? Arrays enthalten keine "Null" - sie können "Null-Elemente" enthalten, was der "leeren Liste" entspricht. Oder könnten Sie ein Array mit einem Element aufweisen, wobei das Element eine Null: my @array = (0);

my @array =(); sollte gut funktionieren - es weist eine neue Array namens @array, und dann ordnet sie die leere Liste, (). Beachten Sie, dass dies identisch ist mit my @array;, da der Anfangswert eines neuen Arrays sowieso leer ist.

Sind Sie sicher, dass Sie einen Fehler von dieser Zeile erhalten, und nicht woanders in Ihrem Code? Stellen Sie sicher, dass Sie use strict; use warnings; in Ihrem Modul oder Skript haben, und überprüfen Sie die Zeilennummer des Fehlers, den Sie erhalten. (Es kann auch hilfreich sein, hier einen Kontextcode einzugeben.)

+0

Entschuldigung. Ja. Ich möchte die Elemente des Arrays auf 0 initialisieren. So kann ich das Array als eine Art Zähler für jeden Index verwenden. Bitte beachten Sie den obigen Kommentar für das genaue Problem. – jerrygo

+0

Wenn Sie ein Array so initialisieren möchten, dass es die gleiche Anzahl von Elementen wie ein anderes Array hat, alle mit einem bestimmten Wert; mach sowas; mein @ arr2 = (0) x @ arr1; – MkV

+0

@MkV: oder 'my @ arr2 = (0) x $ # arr1' auch, nein? – dawg

3

um die Ausgabe in Ihrem Kommentar zu Ihrem Beitrag zu produzieren, das wird d o es:

use strict; 
use warnings; 

my @other_array = (0,0,0,1,2,2,3,3,3,4); 
my @array; 
my %uniqs; 

$uniqs{$_}++ for @other_array; 

foreach (keys %uniqs) { $array[$_]=$uniqs{$_} } 

print "array[$_] = $array[$_]\n" for (0..$#array); 

Ausgang:

array[0] = 3 
    array[1] = 1 
    array[2] = 2 
    array[3] = 3 
    array[4] = 1 

Dies ist anders als Ihr erklärter Algorithmus eine parallele Anordnung mit Nullwerten produzieren, aber es ist eine Perly Art und Weise tun ...

Wenn Sie ein paralleles Array haben müssen, das die gleiche Größe wie Ihr erstes Array mit den auf 0 initialisierten Elementen hat, wird diese Anweisung es dynamisch tun: @array=(0) x scalar(@other_array); aber wirklich, Sie müssen das nicht tun.