Alexander (HH): Regulärer Ausdruck (Zahl darf nicht auf 81100) enden

Beitrag lesen

Moin Moin!

ich habe eine Liste von Zahlen von 200000 bis 399999 (das die Liste keine anderen Zahlen/Strings beinhaltet ist sichergestellt).

Nun sollen alle diese Zahlen angezeigt werden mit Ausnahme derer, die auf 81100 enden.

hmm, bis hierhin wuerde ich sagen, dass man dafuer keinen so grossen aufwand betreiben muessten, sondern dass wohl das folgende das schnellste waere:
print "$_\n" for (200000..(281100-1), (281100+1)..(381100-1), (381100+1)..399999);

Nirgendwo in der Fragestellung steht, dass die Liste LÜCKENLOS oder EINDEUTIG oder SORTIERT ist. Sie könnte es sein, dann wären deine Beispiele halbwegs ok. Vermutlich ist sie es aber nicht, damit erzeugen Deine Beispiele falsche oder wenigstens irreführende Ausgaben.

es draengt sich trotzdem die frage auf: was genau moechtest du? ich denke, es waere besser, wenn du noch etwas mehr kontext erzaehlst, dann kann dir besser geholfen werden.

Korrekt.

Bis dahin kann man nur raten oder sehr allgemeine Antworten geben:

* Das Tool zum Filtern von Listen und Arrays in Perl ist grep. (Wie immer geht es auch anders, aber das ist eine andere Geschichte.)

* grep kann wahlweise einen Ausdruck oder einen Block für jedes Listen- bzw Array-Element auswerten. Für "alles außer" muß der Ausdruck bzw. der Block in aller Regel eine Negation enthalten.

* Die letzten fünf Zeichen eines beliebigen Strings lassen sich z.B. über substr oder eine RegExp ermitteln, wobei substr geringfügig schneller ist. Relevant ist das nur für große Datenmengen.

* Die letzten fünf Ziffern eines positiven Integer können (sofern Perl den Integer wirklich als Integer speichert und nicht wegen zu wenig Bits "heimlich" in Floats konvertiert) auch leicht über den Modulo-Operator bestimmt werden. Das sollte, sofern die Daten Perl-intern bereits Integer sind und nicht erst aus Strings umgerechnet werden müssen, noch schneller als substr sein.

Um also aus einem Array @liste alle Elemente heraus zu fischen, deren letzten vier Stellen 1234 sind, nutzt man Code wie diesen:

  
@ergebnis=grep /1234$/,@liste;  
@ergebnis=grep { /1234$/ } @liste;  
@ergebnis=grep { substr($_,-4) eq '1234' } @liste;  
@ergebnis=grep { $_%10000==1234 } @liste;  

Und um genau diese Elemente nicht im Ergebnis zu haben, negiert man die Tests:

  
@ergebnis=grep !/1234$/,@liste;  
@ergebnis=grep { !/1234$/ } @liste;  
@ergebnis=grep { substr($_,-4) ne '1234' } @liste;  
@ergebnis=grep { $_%10000!=1234 } @liste;  

Alexander

--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".