Anzahl der gelöschten Elemente - scalar(splice) tuts nicht
Chris
- perl
Hi,
ich entferne dynamisch aus einem Array Elemente und möchte die Anzahl der gelöschten Elemente haben.
Mit
my $del_count = scalar(splice @arr, $i, $count)
gehts nicht, weil splice dann im skalaren Kontext aufgerufen wird und dann nur das letzte gelöschte Element zurückgibt.
Bis jetzt löse ich das mit
my @deleted = splice @arr, $i, $count;
my $del_count = @deleted;
Das funktioniert, finde ich aber etwas umständlich.
Geht das nicht einfacher als Einzeiler? Bzw. wie kann man Listen-Kontext "erzwingen"?
Grüßle
Chris
Hey,
wie kann man Listen-Kontext "erzwingen"?
mit runden Klammern. Sehr selten geht das nicht wegen Beschränkungen in der Syntax. Dann behelfe ich mich mit dem Trick, die Liste in eine Arrayreferenz zu verfrachten und dann gleich wieder zu dereferenzieren.
scalar @{[splice @arr, $i, $count]}
So ein Kunstgriff muss immer im Quelltext kommentiert werden!
Hi,
»»
scalar @{[splice @arr, $i, $count]}
danke für die schnelle Hilfe! :)
Trotzdem habe ich noch eine Frage:
wie kann man Listen-Kontext "erzwingen"?
mit runden Klammern. Sehr selten geht das nicht wegen Beschränkungen in der Syntax. Dann behelfe ich mich mit dem Trick, die Liste in eine Arrayreferenz zu verfrachten und dann gleich wieder zu dereferenzieren.
Wie meinst du das mit den runden Klammern und warum geht das jetzt mit splice nicht?
Grüßle
Chris
wie kann man Listen-Kontext "erzwingen"?
mit runden Klammern.
Wie meinst du das mit den runden Klammern
# ungewiss
funktion;
# Skalarkontext erzwungen
scalar funktion;
my $s = funktion;
# Listenkontext erzwungen
(funktion);
my @a = funktion;
my ($foo, $bar) = funktion;
## die Methode liefert eine Liste, und wir möchten ein bestimmtes Element
# leider Syntaxfehler
$obj->methode[42];
# dito
($obj->methode)[42];
# so wird ein Schuh draus
[$obj->methode]->[42];
und warum geht das jetzt mit splice nicht?
Weil sich scalar
die Klammern zuerst schnappt und sie deswegen nicht mehr zum Listenkontext oder Gruppieren zum tragen kommen. Die Klammern um einen einzelnen Funktionsparameter sind optional, das kannst du auch gut sehen, wenn du mal das Beispiel von <#m916130> durch perl -MO=Deparse
jagst.
Danke für deine ausführlichen Erklärungen! Sehr interessant!
und warum geht das jetzt mit splice nicht?
Weil sichscalar
die Klammern zuerst schnappt und sie deswegen nicht mehr zum Listenkontext oder Gruppieren zum tragen kommen. Die Klammern um einen einzelnen Funktionsparameter sind optional, das kannst du auch gut sehen, wenn du mal das Beispiel von <#m916130> durchperl -MO=Deparse
jagst.
perl -MO=Deparse
kannte ich nocht nicht, das ist ja echt genial :)
Mit runden Klammern kann ich nun in manchen Fällen Listen-Kontext erzwingen, z.B. (funktion);
. Warum geht das nun bei dem splice nicht? Dass ein Klammernpaar nicht reicht ist klar, aber mit zwei gehts auch nicht.
# geht nicht
scalar( (splice(@arr, $i, $c)) );
Das hab ich mir auch schon mit -MO=Deparse angeschaut und dann verschwinden tatsächlich beide Klammern um splice herum. Das erscheint mir nun nicht so logisch.
Ich probiere mal noch
my $anz = ( splice(@arr, $i, $c) );
aus.
Grüße
Chris