Chris: Anzahl der gelöschten Elemente - scalar(splice) tuts nicht

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

  1. 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!

    --
    水-金-地-火-木-土-天-海-冥
    1. 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

      1. 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.

        --
        水-金-地-火-木-土-天-海-冥
        1. Danke für deine ausführlichen Erklärungen! Sehr interessant!

          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.

          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