Ja, da kann ich Marc nur zustimmen, einfach den Code von einer in der anderen Sprache zu Schreiben ist ziemlich schlecht, du musst wenn es geht die Sprache von Anfang an Lernen und es mit den Eigenschaften der Sprache versehen. Ich nehme auch mal oberes Beispiel und kreiire die verschiedenen Perl Möglichkeiten.
Vorweg, da halt der "print" Befehl bei Perl im Listenkontext Arbeitet, würde man das ganze in perl letztendlich wohl so schreiben:
my @foo = qw/42 spam none/;
print @foo;
Man sagt also: "Gib das Array aus", und nicht "Laufe über das Array von 0 bis zur Maixmalen anzahl und gib mir jeweils das Element aus."
Jemand der nur C kennt wird es zu Anfang wohl eher so schreiben:
my @foo = ('42', 'spam', 'None');
for (my $i=0; $i<scalar @foo; $i++) {
print $foo[$i];
}
Die erste Verbesserung wäre eine leichtere Deklaration, und eine leichtere for Schleife:
@foo = qw/42 spam none/;
for my $i (@foo) {
print $i;
}
Da es hier eigentlich Logisch sein sollte das man über jedes Element des Arrays Itterriert, kann man sich natürlich fragen warum man explizit eine Zählvariabel angeben muss, also macht der Erfahrene perl programmierer hier etwas Magie:
for (@foo) {
print;
}
Schneller geschrieben, schneller gelesen, und du wirst den Sinn schneller verstehen. Sofern du darin geübt bist.
Da du nur ein befehl benutzt ist es eigentlich unsinnig einen Block zu benutzen.
@foo = qw/42 spam none/;
print for @foo;
Das kannst du Lesen wie es da steht. "print" für jedes Element aus "@foo".
Ansonsten kommt es noch weiter darauf an. Wenn du die Elemente einfach nur ausgeben möchtest, brauchst du keine Zwischenvariable.
print for qw/42 spam None/;
Oder wie benutzen den Funktionalen Ansatz, für jedes Element aus dem Array wird eine Funktion aufgerufen.
my @foo = qw/42 spam none/;
map print, @foo;
Sofern man im programmcode einfach nur die Werte ausgeben möchte, kann man wie gesagt wieder auf die Temporäre variable verzichten.
map print, qw/42 spam None/;
Da die Sachen einfach nur aneinander gereit werden, kann es sein das wir z.B. Leerzeichen zwischen den Werten haben wollen.
my @foo = qw/42 spam none/;
print "@foo";
Dadurch das das Array im String ist, wird beim Interpolieren einfach die Werte in ein Einzelnen String verwandelt und mit leerzeichen voneinander getrennt.
An sich ist die obere Aussage eigentlich falsch. Den es wird zwischen den Werten eigentlich der Inhalt aus der Spezialvariable $" genommen. Wenn wir diese variable z.B. auf "\n" setzen, dann werden die Werte mit einem "\n" zusammengefügt. Das heißt wir würden auf jeder zeile ein Wort stehen haben.
my @foo = qw/42 spam None/;
$" = "\n";
print "@foo\n";
Anstatt die Spezialvariable zu überschreiben können wir aber auch wieder den etwas Funktionaleren Teil nehmen. Und die Elemente zusammenfügen, ein String daraus bauen, und dann erst ausgeben.
my @foo = qw/42 spam None/;
print join "\n", @foo;
Oder alles in einem:
print join "\n", qw/42 spam None/;
Oder anstatt einen String zu bauen, einfach jedes Element zusätzlich mit einem "\n" ausgeben lassen.
my @foo = qw/42 spam None/;
map print "$_\n", @foo;
Oder wir geben einfach für jedes Element 2 Werte aus, das element selber + ein Newline Zeichen, und dieser Rückgabewert wird wieder an print übergeben.
my @foo = qw/42 spam None/;
print map( ($_, "\n"), @foo);
Oder man könnte auch hingehen und eine Funktion für jede Listenelement ausführen lassen. In der dann z.B. noch größere Veränderungen gemacht werden könnten. Das Beispiel ist natürlich so sinnloss soll nur Zeigen das es auch möglich ist.
my @foo = qw/42 spam None/;
map ausgabe($_), @foo;
sub ausgabe {
my $input = shift;
print $input;
}
u.s.w.