Holger: Sortieren eine Arrays..

Hallo,

Stehe aml wieder vor einem Problem.

Ich Habe ein txt. Datei:

test 1test 1test 1
test  2test  2test  2
test 3test 3test 3
test   4test   4test  4
test 5...
.
.
Nun möchte ich mit einem Script diese Sortieren.
Spalte 2 soll sortiert werden, und die andere automatisch mit.

@sortiert = sort {uc($a) cmp uc($b)} @besucher;

Funktioniert. Nur das Problem,
Es wertet Leerzeichen mit aus.
test 1
test 3
test 5
test  2
test   4

Und sollte eigentlich

test 1
test  2
test 3
test   4
test 5

Ausgegeben werden,

Wer kann mir Helfen ?

Danke

Holger

  1. Sup!

    @sortiert = sort {uc($a) cmp uc($b)} @besucher;

    Du haettest ruhig ein wenig mehr von Deinem Programm posten koennen...

    Wie auch immer, entsprechend unvollstaendig wie Deine Angaben hier mein Vorschlag, der natuerlich, haettest Du verraten, wie Dein Array besucher genau aussieht (liste von referenzen oder namen?), exakter haette sein koennen:

    @sortiert = sort ohnespace @besucher;

    sub ohnespace
    {
    spacesweg ($a) gt spacesweg($b);

    bei array von referenzen auf arrays: spacesweg (${$a}[1]) gt spacesweg(${$b}[1]);

    }

    sub spacesweg
      {
        my ($string) = @_;
        $string =~ s/ //g;
        return $string;
      }

    Hoffe mal, das passt auch so irgendwie, kauf Dir doch mal "Programming Perl" von Larry Wall...

    Calocybe moege mich verbessern, wenn ich Mist geschrieben habe - oder xwolf :-)

    Gruesse,

    Bio

    1. Hallo nochmals,

      Die TXT-Datei

      a/a0000010.jpgDas  A 9bemerkung1300
      b/b0000010.gifDas B 10kritik1300
      a/a0000011.ipgBild A 11anregung1300
      b/b0000011.jpgTest Bsonstiges1300

      Die Datei wird so eingelesen:

      open(FILE,"<test.txt");
      @besucher = <FILE>;
      close(FILE);
      .
      .
      ---------------------Hier sollte doch die Sortierung rein ?
      .
      .
      foreach $EINTRAG(@sortiert) {
        $EINTRAG =~ s/^ +//;
         $EINTRAG=~s/\n//g;
         $EINTRAG=~s/\r//g;
      $EINTRAG=~s/ä/&auml;/g;
      $EINTRAG=~s/ö/&ouml;/g;
      $EINTRAG=~s/ü/&uuml;/g;
      $EINTRAG=~s/Ä/&Auml;/g;
      $EINTRAG=~s/Ö/&Ouml;/g;
      $EINTRAG=~s/Ü/&Uuml;/g;
      $EINTRAG=~s/ß/&szlig;/g;

      ($file,$name,$bemwerkung,$hits,$down) = split(//,$EINTRAG);

      print "----
        print "---- Ausgabe ...
        print "----
      }

      exit;

      Ende

      Es soll nur nach der zweiten Spalte Sortiert werden,
      allerding sollten alle anderen mitsortiert werden.

      Ausgegeben wird es so:
      ----------------------

      Bild A 11  Hyperlink dazu ist dann die erste Spalte
      Das B 10B      dito           .             .
      Das  A 9         .            .             .
      Test B           .            .             .

      Ich möchte es aber so azsgegeben haben:
      ---------------------------------------

      Bild A 11
      Das  A 9
      Das B 10B
      Test B

      Danke

      Holger

      1. Hi,

        wenn Deine Frage nichts mit CGI zu tun hat (und das hat sie nicht), solltest Du sie nicht für den Themenbereich CGI stellen.

        Es soll nur nach der zweiten Spalte Sortiert werden,
        allerding sollten alle anderen mitsortiert werden.

        perldoc -f sort
        perldoc -f split

        my @sorted_array = sort { (split(//,$a))[1] cmp (split(//,$b))[1] } @unsorted_array;

        Bei größeren Datenmengen lohnt es sich, die Felder vorher umzusortieren (auch mit split), da die Zahl der splits sonst exponentiell steigt.

        Cheatah

        1. Das wars, es Funktioniert.

          Danke

          Holger

          1. Das wars, es Funktioniert.

            hi holger
            ich würde das wauch vorher zerlegen und dann erst sortieren:
            also
            open(IN,$filename);
            while(<IN>)
               {
               chomp;   # Zeilenumbruch weg
               s/^\s*//;  # leerzeichen, tabs und so am anfang weg
               s/\s*$//;  # leerzeichen, tabs und so am ende weg
               #hier noch Deine Zeichenumstelllung
               s/[äöüÄÖÜß]/$1;/g;
               my(@line) = split('',$_);
               push @besucher,[@line];
               #siehe auch perldsc
               }
            $sortcol = 1;
            foreach $lineref (sort {$a->[$sortcol] cmp $b->[$sortcol]} @besucher)
               {
               print "$line->[0], $line->[1] .....\n";
               #siehe auch perldsc List of List
               }

            1. hi,
              sorry ist noch rech früh.
              um diese Zeit bin ich noch ein Tastaturlegasteniker.

              am Ende sollte es heißen
              foreach $lineref (sort {$a->[$sortcol] cmp $b->[$sortcol]} @besucher)
                 {
                 print "$lineref->[0], $lineref->[1] .....\n";
                 #siehe auch perldsc List of List
                 }

              Grüße
              klaus