klaus: Datei bzw. Array Ausgabe bei RegExp Match

Hi,

ich hab ein File (welches im array @file ist), welches wie folgt aussieht:

asadf
asdfas sd
asdfsf
ID
1
2
3

adsf a
sad
f
asdf
sadf
ID
2
34
6

sadfasd
asdf
usw.

Nun will ich alles was nach der ID kommt bis zur Leerzeile ausgeben.
Ich weiss nun nicht, wie man das am besten anstellt. Vielleicht irgendwie die Arrayelemente "shiften"? Kein Plan.

Mein Miniansatz bislang ...
foreach my $i (@file)
{
if ($i =~ /ID/) { ??? }
}

Tipps?

Danke.

MfG,
Klaus

  1. Hi,

    ID
    1
    2
    3

    Nun will ich alles was nach der ID kommt bis zur Leerzeile ausgeben.

    Wenn die Anzahl der Folgezeilen immer gleich ist könntest Du mit "$.", der Zeilennummer arbeiten. Wenn da nur Zahlen stehen, wirds evntl. noch einfacher.

    Hotte

    1. Hi,

      Hi,

      ID
      1
      2
      3

      Nun will ich alles was nach der ID kommt bis zur Leerzeile ausgeben.

      Wenn die Anzahl der Folgezeilen immer gleich ist könntest Du mit "$.", der Zeilennummer arbeiten. Wenn da nur Zahlen stehen, wirds evntl. noch einfacher.

      Hotte

      leider sind es keine Zahlen und die Anzahl der Zeilen ist auch variabel.

      ciao,
      Klaus

  2. Hi,

    ich hab ein File (welches im array @file ist),

    Wrong Approach, weil du an dieser Stelle bereits Information vernichtet hast.
    Womöglich hast du auch ein katastrophales Fileformat.

    welches wie folgt aussieht:

    asadf
    asdfas sd
    asdfsf
    ID
    1
    2
    3

    adsf a

    Und wie sieht das Rohfile aus?

    mfg Beat;

    --
    Woran ich arbeite:
    X-Torah
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o
    1. Hi,

      Und wie sieht das Rohfile aus?

      genau so wie im ersten Post.
      Ich hab nur ein my @file = <READ>; gemacht.

      ciao,
      Klaus

      1. Und wie sieht das Rohfile aus?
        genau so wie im ersten Post.
        Ich hab nur ein my @file = <READ>; gemacht.

        Wenn du den Handle-Zeilen-Separator auf \n\n setzt:

        my $oldlinesep = $;
          $\ = "\n\n";

        Dann kannst du

        while(<FILE>){
            $_ =~m/$some_pattern/ and do_something();
          }

        verwenden.
        Denke daran, den Handle-Zeilen-Separator wieder zurückzusetzen.

        $\ = $oldlinesep;

        Kopieren eines Files in einen Array ist fast immer schlecht.

        mfg Beat

        --
        Woran ich arbeite:
        X-Torah
        ><o(((°>           ><o(((°>
           <°)))o><                     ><o(((°>o
        1. Und wie sieht das Rohfile aus?
          genau so wie im ersten Post.
          Ich hab nur ein my @file = <READ>; gemacht.

          Wenn du den Handle-Zeilen-Separator auf \n\n setzt:

          my $oldlinesep = $;
            $\ = "\n\n";

          Korrektur.
          Der Input-Line-Separator für das Handle ist $/ .

          mfg Beat

          1. Korrektur.
            Der Input-Line-Separator für das Handle ist $/ .

            Und das korrekte Vorgehen wäre local $/ = "\n\n"; :)

            Siechfred

        2. Hi,

          $\ = "\n\n";

          Dann kannst du

          while(<FILE>){
              $_ =~m/$some_pattern/ and do_something();
            }

          ich hab noch nicht ganz verstanden was $/ macht bzw. wie ich das dann in der Funktion für meine Zwecke umsetzen kann? Kannst mir noch etwas mehr helfen?

          ciao,
          Klaus

          1. $\ = "\n\n";
            Dann kannst du
              while(<FILE>){
                $_ =~m/$some_pattern/ and do_something();
              }

            ich hab noch nicht ganz verstanden was $/ macht bzw. wie ich das dann in der Funktion für meine Zwecke umsetzen kann? Kannst mir noch etwas mehr helfen?

            Ein <FILEHANDLE> operiert im Scalarkontext oder im Listenkontext. Aber woran erkennt denn das Programm, wie es im Listenkontext eine "Zeile" abzutrennen hat? Per Default anhand von "\n".
            Da bei dir aber ein Record durch "\n\n" abgeschlossen wird, wäre dies ein geeigneter Separator für $/ .

            mfg Beat

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

    Hallo Klaus, nur so als Gedankenanstoß: Kann es sein das dir hiernbei ein mehrdimensionales Array besser passen würde? Ein leerer Datensatz im Array als Trenner? Das scheint mir doch wohl nicht der richtige Weg zu sein.

    als Beispiel: um diene Werte zu nehmen:
    $array=array(0=>array('werte'=>array(0=>'asadf',
                                         1=>'asdfas sd',
                                         2=>'asdfsf'),
                          'ID'=>array(0=>1,
                                      1=>2,
                                      2=>3)
                         ),
                 1=>array('werte'=>array(0=>'adsf a',
                                         1=>'sad',
                                         2=>'f',
                                         3=>'asdf',
                                         4=>'sadf'),
                          'ID'=>array(0=>2,
                                      1=>34,
                                      2=>6)
                         )
                 )

    Denk mal drüber nach.

    Gruß Bobby

    --
    -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
    -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
    ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
    1. Moin

      Ups, falsche Scriptsprache. Sollte für Perl aber auch gelten auch wenn die Schreibweise sicher andres ist. Das kann ich nicht beurteilen, da ich in Perl nicht bewandert bin.

      Mal drüber informieren.

      Also nochmal sorry.

      Gruß Bobby

      --
      -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
      -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
      ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)