Philipp Hasenfratz: Ausgelesene Zeilen in Perl miteinander vergleichen, WIE?

Beitrag lesen

Halihallo Sergej

habe folgendes Problem:
mittels
open(FHin, "< $inFile") or die "\nKann $inFile nicht oeffnen: $!";
lese ich den Testfile ein, kein Problem.

Dateihandles sollten GROSS geschrieben. Kleine Stilkritik.

$/="\n"; # Ende einer Zeichenkette ist der Zeilenumbruch !!

brauchst du nicht.

while(<>){ # Solange Zeile existiert <== ???

Eine Zeile von was? - Verwende besser den Dateihandle:

while( <FHin> )...   und ja, solange noch Zeilen einzulsesen sind, tue dis, tue das...

@zeile[$z_nr] = chomp;

Dann enthält @zeile[$z_nr] immer das gelöschte Zeichen, sprich die Newline.

chomp;
$zeile[$z_nr] = $_;

Ein Element eines Arrays ist und bleibt ein Skalar => $ statt @. Mit @zeile[...] erhälst
du einen splice (Teilbereich) des Arrays, das willst du hier aber nicht.

perldoc perldata

richtig, oder muß @array davor??????

@array davor? - Was meinst du damit. Dennoch ein nein vorab.

bei array, error: @zeile[$z_nr] better written as $zeile[$z_nr] at # xx.bat line 36.

Tja, ein Splice über einen Index ist das Element per se, aber auf die Elemente eines
Arrays sollte besser mit

$array[$index]

zugegriffen werden.

my $MsgVon = 23;
my $MsgBis = 45;
@Msg[$z_nr]  = substr($zeile[$z_nr], $MsgVon, $MsgBis);

$Msg[$z_nr]...

for($wert=$z_nr; $wert>=1; $wert--){
    if ($Msg[$z_nr] == $Msg[$wert]  {

^^

eq statt ==, denn == ist für den Vergleich zweier Zahlen. eq ist das Äquivalent für
Strings.

Wenn du jede Zeile mit jeder vergleichen willst, wirst du zwei for-Schleifen benötigen.

for ( my $i=0; $i < @Msg; $i++ ) {
   for ( my $j=0; $j < @Msg; $j++ ) {
      next if ( $i == $j );   # sonst wird jeder Eintrag ausgegeben, da jeder mit sich
                              # selber verglichen true ist.
      if ($Msg[$i] eq $Msg[$j]) {
         print FHout $Msg[$i]."\n";
      }
   }
}

Viele Grüsse

Philipp