roman lenz: array sortieren / Schwartzsche Transformation

hi hi

ich möchte einen array (tabelle) nach einer vorgegebenen Spalte sortieren. Ich will dazu die "Schwartzsche Transformation" nutzen. Rolf Post und  Eike Grote haben darüber etwas geschrieben
( http://i-netlab.de/cgi-bin/index.cgi?display=40.13
  <http://perl-seiten.bei.t-online.de/perl/perl_schw.html)

das script unten funct. und zeig die transf.
ich will das ganze um 3 aufgaben erweitern:
  1) $sort gibt vor nach welcher spalte sortiert werden soll
     (Spaltentrenner ist ein leerzeichen)
  2) $sortart gibt vor ob alpha-oder nummerrisch sortiert werden soll
  3) wenn $such definiert ist sollen nur die zeilen sortiert werden
     die $such enthalten ansonsten sollen alle sortiert werden.

zu 1) mit ($m1,$m2,$m3,$m4,$m5)= split(/ /,$_); komme ich an die
      spaltenelemente aber ich bekommen dann z.B. $m4 nicht als
      sortwert eingesetzt
zu 2) u. 3) dieses kann ich ausserhalb der
            "Schwartzsche Transformation" abfangen.
            schön wäre es aber wenn das mit eingebaut wäre

Über tips anregungen und/ oder lösungsansätze bin ich sehr froh

besten dank

bis bis roman

#!perl.exe

use strict;
use CGI qw(:standard);
use CGI::Carp qw(fatalsToBrowser);
my ($m,$m1,$m2,$m3,$m4,$m5);
my @zeilen=("roman lenz 35 67655 kaiserslautern",
            "imke toll 33 55555 japan",
            "uwe buelow 31 40444 leverkusen",
            "mutter benz 62 40764 langenfeld");

#my $such;
my $such="40";
my $sort="4 spalte";
#my $sort="2 spalte";
my $sortart="<=>";
#my $sortart="cmp";
my $cgi = new CGI; # neues Objekt erstellen

print $cgi->header(-type => 'text/html');
foreach(@zeilen) {
print $."<br>";
}
print "<br>";
print "<br>";
@zeilen = map { $
->[0> }
          sort { $a->[1] <=> $b->[1] }
          map { [ $_, (/^.+? (\d+)/)[0] ] } @zeilen;
                                   #^^^ wofür ist das gut ??
foreach(@zeilen) {
if(!$such||/$such/){
print $_."<br>";
}
}

--
P.S. manchmal wundere ich mich schon über die postings (fragen u. antworten) die man hier geboten bekommt(meine eigenen [leider] mit eingenommen)
=> ich denke mir meinen teil und ziehe das beste daraus :-)
  1. hi Roman,

    ich möchte einen array (tabelle) nach einer vorgegebenen Spalte sortieren. Ich will dazu die "Schwartzsche Transformation" nutzen. Rolf Post und  Eike Grote haben darüber etwas geschrieben
    ( http://i-netlab.de/cgi-bin/index.cgi?display=40.13
      http://perl-seiten.bei.t-online.de/perl/perl_schw.html

    das script unten funct. und zeig die transf.
    ich will das ganze um 3 aufgaben erweitern:
      1) $sort gibt vor nach welcher spalte sortiert werden soll
         (Spaltentrenner ist ein leerzeichen)
      2) $sortart gibt vor ob alpha-oder nummerrisch sortiert werden soll
      3) wenn $such definiert ist sollen nur die zeilen sortiert werden
         die $such enthalten ansonsten sollen alle sortiert werden.

    1. zum sortieren nimm am besten den <=> als Vergl. Operator.

    • das sortiert numerisch
    • zum sortieren nach ascii-order nimm die Werte in die ord()funktion, dann kann auch ascii mit <=> sortiert werden

    2. die sortierhilfe baust du so dass ein parameter übergeben wird welcher sagt nach welchem wert sort. werden soll

    @a = sort{ sorthilfe($a,$x) <=> sortierhilfe($a,$x)}@unsorted_a;

    ein Beispiel als CGI findest du hier
    http://perlbase.xwolf.de/cgi-bin/perlbase.cgi?dis.10.20

    Rolf

    1. hi Rolf

      dank die für deine Antwort.

      ich will es erstmal mit der "Schwartzsche Transformation" versuchen zum einen interessiert mich das und zum anderen ist sie ja auch schneller :-)

      @zeilen = map { $_->[0] }
                sort { $a->[1] <=> $b->[1] }
                map { [ $_, (/^.+? (\d+)/)[0] ] } @zeilen;
                                          ^^^
                                     weist du wofür das hier gut ist
                                     mein Beis. läuft mit und ohne *kratz*

      bis bis roman

      --
      P.S. manchmal wundere ich mich schon über die postings (fragen u. antworten) die man hier geboten bekommt(meine eigenen [leider] mit eingenommen)
      => ich denke mir meinen teil und ziehe das beste daraus :-)
      1. hi Roman,

        @zeilen = map { $_->[0] }
                  sort { $a->[1] <=> $b->[1] }
                  map { [ $_, (/^.+? (\d+)/)[0] ] } @zeilen;
                                            ^^^
                                       weist du wofür das hier gut ist
                                       mein Beis. läuft mit und ohne *kratz*

        das sind die elemente des anomymen Arrays im Schritt 1 (siehe meine Dok i. Link)
        [0]                    [1]
        [hier steht der record][hier steht der Value nach dem sortiert wird]

        --> die RegEx ermittelt den Value aus dem Record, also aus [0]

        Anstelle einer RegEx kannst du auch eine eigenen Funktion verwenden like this:

        my @ergebnis = map { $_->[0] }
         sort { $a->[1] <=> $b->[1] }
         map { [ $_, ( hier($_,$depth) )[0] ] } @numbers;

        In der Hoffnung dass damit alle Klaheiten beseitigt sind ;-)

        Rosti

        1. hi Rolf

          das sind die elemente des anomymen Arrays im Schritt 1 (siehe meine Dok i. Link)
          [0]                    [1]
          [hier steht der record][hier steht der Value nach dem sortiert wird]

          jeep das war mir klar :-)

          --> die RegEx ermittelt den Value aus dem Record, also aus [0]

          jeep da aber [0] und $_ identisch sind kann man doch den zusatz [0] weg lassen.? wie gesagt bei mir klappt das mit und ohne.
          warum kommt der zusatz [0] dahinter? ich hätte gesagt das es wie in der m-funct. aussehen sollte ($_=~/...../).

          Anstelle einer RegEx kannst du auch eine eigenen Funktion verwenden like this:

          jeep kenn ich :-)

          ich leser überall das man die map funct. auch mit blockelementen benutzen kann. habe aber noch nie ein Beisp. gesehen und das auch noch nicht ganz gerafft. hast du ein besp. für ein block in der map function?

          In der Hoffnung dass damit alle Klaheiten beseitigt sind ;-)

          die klarheiten beseitige ich jetzt    ploppp ziiisch und wech ;-)

          besten dank für deine antwort

          bis bis roman

          --
          P.S. manchmal wundere ich mich schon über die postings (fragen u. antworten) die man hier geboten bekommt(meine eigenen [leider] mit eingenommen)
          => ich denke mir meinen teil und ziehe das beste daraus :-)
          1. hi Roman,

            das sind die elemente des anomymen Arrays im Schritt 1 (siehe meine Dok i. Link)
            [0]                    [1]
            [hier steht der record][hier steht der Value nach dem sortiert wird]
            jeep das war mir klar :-)
            --> die RegEx ermittelt den Value aus dem Record, also aus [0]
            jeep da aber [0] und $_ identisch sind kann man doch den zusatz [0] weg lassen.? wie gesagt bei mir klappt das mit und ohne.

            Ouh, Du hast recht, das stimmt!
            Weglass-das ;-)

            In der Hoffnung dass damit alle Klaheiten beseitigt sind ;-)
            die klarheiten beseitige ich jetzt    ploppp ziiisch und wech ;-)

            Komm bald wieder ;-)

            Viele Grüße, Rolf

            1. hi Rolf

              Ouh, Du hast recht, das stimmt!
              Weglass-das ;-)

              ich hab was richtig gemacht *freu* zur belohnung ploppp ziiisch und wech

              bis bis roman

              --
              P.S. manchmal wundere ich mich schon über die postings (fragen u. antworten) die man hier geboten bekommt(meine eigenen [leider] mit eingenommen)
              => ich denke mir meinen teil und ziehe das beste daraus :-)
  2. hi again, Roman

    ich möchte einen array (tabelle) nach einer vorgegebenen Spalte sortieren. Ich will dazu die "Schwartzsche Transformation" nutzen. Rolf Post und  Eike Grote haben darüber etwas geschrieben
    ( http://i-netlab.de/cgi-bin/index.cgi?display=40.13

    da meine Antwort-Mail an dich nicht zustellbar war:
    Vielen Dank für Dein Feedback von Gestern!

    Viele Grüße, Rolf