Beat: Tie::file und splice

Beitrag lesen

Das Problem ist, dass Dir der Index in einer for/foreach-Schleife nicht von Perl geliefert wird, Du musst also mitzählen. Das könnte dann so aussehen:

my $i = 0;

foreach(@arr) {
  splice @arr, $i, 1 if /$pattern/;
  $i++;
}

  
Achtung bei diesem Code.  
Es ist nicht empfehlenswert, den Array zu splicen, über den ich gerade iteriere.  
Auch ist es elend langsam, sobald mehrere Einträge gelöscht werden müssen.  
  
Ich lese nämlich gerade meinen eigenen perlcode, in welchem ich Leere Zeilen in einem Array bei Tie::File löschen will.  
Ich habe das Problem hierbei wie folgt gelöst:  
  
In dieser Aufgabe habe ich mehrere Zeilen zu löschen,  
Das registrieren der Löschzeilen und das effektive Löschen sind hierbei verschiedene Vorgänge. Splice finden NICHT während dem Iterieren statt.  
  
Ich habe das Script gekürzt.  
  
~~~perl
my @mes; # Dieser Array soll bereinigt werden.  
tie( @mes, 'Tie::File', $Files{messages} ) or  
     error('datei', "Sub Comtrash Tied $Files{messages} $!");  
# ...  
my $cnt = 0;    # Dieser Counter ist ganz wichtig, denn er soll die  
                #Arrayelemente zählen und den Indes in @splicers eintragen  
my @splicers;   # ein Hilfsarray  
  
for( @mes ){  
  if(...){...}  
  if(...){  
      #...  
      # warum unshift statt push? siehe unten.  
      unshift( @splicers, $cnt );  
  }  
  # ...  
  $cnt++;  
}  
# jetzt die in @splice gespeicherten Zeilen aufräumen, von hinten!  
foreach( @splicers ){  
  splice( @mes, $_, 1);  
}  
untie( @mes );  

Gut daran ist, dass ich nicht über den Array splice, über welchen ich iteriere.
Problematisch ist daran eventuell die Performance. Aber die ist bei splice immanent.
Es hängt ganz davon ab, wie stark @splice populiert sind, und ob es sich um späte Elemente im Array handelt (gut), oder um frühe (schlecht).
Weil in @splicers die Einträge absteigend vorliegen (29,16,12,9,3), habe ich den Vorzug, das splicing von hinten beginnt, und damit tendenziell schneller arbeitet.

Gäbe es hier noch etwas zu optimieren?
Ja ich sehe noch Potential
  splice( @mes, $_, 1);
Wenn zwei Elemente aufeinanderfolgen wie in
@splicers = (29,28,27,8,7,1)
liesse sich der Umstand beschleunigen, dass 29,28,27 in einer einzigen Operation gespliced werden könnten.

mfg Beat

--
Woran ich arbeite:
X-Torah
   <°)))o><                      ><o(((°>o