Mein Name oder Nickname: splice xmlstruktur

Hey!!

ich möchte mittels perl eine datei in ein arrey einlesen die eine xml struktur hat also sieht das array in etwa so aus [Hauptseite]xxx[/Hauptseite][Unterseite]xxx[/Unterseite][Privat]xxx[Privat][About]xxx[/About] (fragt jetzt nicht nach dem sinn ;))) )
Nun möchte ich aus dem array zum beispiel [Privat]xxx[/Privat] rauslöschen und diese in eine weitere Datei schreiben.
Sprich:
Datei vorher:
[Hauptseite]xxx[/Hauptseite][Unterseite]xxx[/Unterseite][Privat]xxx[Privat][About]xxx[/About]
Datei nachher (soll so aussehen):
[Hauptseite]xxx[/Hauptseite][Unterseite]xxx[/Unterseite][About]xxx[/About]

Ich finde einfach kein hilfreiches tutorial wie ich das schaffen könnte (mit splice) vorallem ist das problem das ich vor dem einlesen nie weiss was zwischen [Privat] und [/Privat] steht.

Lange rede kurzer sinn: wie geht das? ;)))

viele liebe grüsse.

ps: die Datei ist keine reine xml datei also wird mir das modul XML::Simple (oder ähnlich sofern es überhaupt sinn macht) nicht helfen.

  1. ich möchte mittels perl eine datei in ein arrey einlesen die eine xml struktur hat also sieht das array in etwa so aus [Hauptseite]xxx[/Hauptseite][Unterseite]xxx[/Unterseite][Privat]xxx[Privat][About]xxx[/About] (fragt jetzt nicht nach dem sinn ;))) )
    Nun möchte ich aus dem array zum beispiel [Privat]xxx[/Privat] rauslöschen und diese in eine weitere Datei schreiben.
    Sprich:
    Datei vorher:
    [Hauptseite]xxx[/Hauptseite][Unterseite]xxx[/Unterseite][Privat]xxx[Privat][About]xxx[/About]
    Datei nachher (soll so aussehen):
    [Hauptseite]xxx[/Hauptseite][Unterseite]xxx[/Unterseite][About]xxx[/About]

    Ich finde einfach kein hilfreiches tutorial wie ich das schaffen könnte (mit splice) vorallem ist das problem das ich vor dem einlesen nie weiss was zwischen [Privat] und [/Privat] steht.

    splice() löscht Elmente aus einem Array unabhängig von dessen Inhalt allein aufgrund des Index. Deine Aufgabe ist also: Zuerst über den Array iterieren und via RegEx das Element erkennen, eventuell woanders hin zu speichern und den Index zu speichern. Nach Schleife-Schluss wendest du dann die splice() Funktion an auf den gespeicherten Index deines Arrays. Es ginge eventuell auch einfacher. Aber ich weiss nicht, was du letztendlich willst.

    mfg Beat

    --
    Woran ich arbeite:
    X-Torah
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o
    1. Hey Beat!!
      Danke hab es geschafft!

      Jetzt hab ich dann doch noch eine frage und ich komm einfach nicht drauf:
      wie kann ich herausfinden ob in einer datei die letzte zeile eine leerzeile ist?

      mit if ($dat =~ /^\s*/) {..} sucht er ja nur ob in der Datei überhaupt eine leerzeile ist aber ich brauche nur die information: ist in der LETZTEN zeile der datei eine leerzeile?

      datei zuerst in ein array einlesen und prüfen ob $# eine leerzeile ist klappt nicht und es ist doch auch nicht das wahre oder?

      viele liebe grüsse und danke dir nochmal Beat!

      1. Jetzt hab ich dann doch noch eine frage und ich komm einfach nicht drauf:
        wie kann ich herausfinden ob in einer datei die letzte zeile eine leerzeile ist?

        Verwendest du Tie:File

        foreach(@array){
          $_ eq '' and print 'leere Zeile';
        }

        bei normalem Zeilenweise durchlaufen

        foreach(@array){
          $_ eq "\n" and print 'leere Zeile';
        }

        Eine Zeile besteht normalerweise aus einem Linefeed, nicht aber bei Tie:File.
        (Das setzt natürlich voraus dass der Zeilentrenner wirklich \n ist, und nicht umgestellt wurde.)

        mfg Beat;

        --
        Woran ich arbeite:
        X-Torah
        ><o(((°>           ><o(((°>
           <°)))o><                     ><o(((°>o
        1. Hey!!
          Danke dir nochmals Beat klappt alles super nur jetzt steh ich schon wieder vor zwei problemen hoffe du bzw. jemand anderer kann mir da auch noch unter die arme greifen.

          1. Wenn ich die Datei auslese splite ich die [xml]inhalt[/xml] so dass ich nur den "inhalt" sehen kann also ist der inhalt zum beispiel über $xml[1] erreichbar das ist alles ok. Jetzt gibt es aber beim einlesen von zum beispiel [xml][/xml] (sprich: keinen inhalt) ein problem zur veranschauchlichung (schreibt man das so? ne ich glaub des gibts gar nicht lol)

          Dateiinhalt:
          [Hauptseite]inhalt EINS[/Hauptseite][Unterseite]inhalt ZWEI[/Unterseite][Privat]inhalt DREI[/Privat]
          Ich splitte und komme somit an die jeweiligen inhalte heran so ist
          $xml[0] = inhalt EINS
          $xml[1] = inhalt ZWEI
          usw.

          Wenn der Dateiinhalt aber so aussieht:
          [Hauptseite]inhalt EINS[/Hauptseite][Unterseite][/Unterseite][Privat]inhalt DREI[/Privat]
          befindet sich "inhalt DREI" in $xml[1] wobei es eigentlich in $xml[2] sein sollte.
          mit $schleife =~ s// /g; klappt es auch nicht wie mach ich das am besten? Hoffe ihr wisst was ich damit meine?

          2. In einer Datei gibt es mehrere xml strukturen die gefolgt aussehen:
          [Hauptseite]inhalt EINS[/Hauptseite][Unterseite]inhalt ZWEI[/Unterseite][Privat]inhalt DREI[/Privat]
          [Hauptseite]inhalt EINS[/Hauptseite][Unterseite]inhalt ZWEI[/Unterseite][Privat]inhalt DREI[/Privat]
          [Hauptseite]inhalt EINS[/Hauptseite][Unterseite]inhalt ZWEI[/Unterseite][Privat]inhalt DREI[/Privat]
          usw.
          Die lassen sich alle gut ansprechen mit einer foreach/while schleife nur wenn die datei etwas unförmig ist also so zum beispiel:
          [Hauptseite]inhalt EINS[/Hauptseite][Unterseite]inhalt ZWEI[/Unterseite][Privat]inhalt DREI[/Privat][Hauptseite]inhalt EINS[/Hauptseite][Unterseite]inhalt ZWEI[/Unterseite][Privat]inhalt DREI[/Privat]
          (Zwischen Privat und Hauptseite sollte eigentlich eine neue zeile beginnen) wird mir ab da an nichts mehr gezeigt. Soweit ich weiss muss bei einer schleife die eine datei durchläuft es bei jedem neuen durchlauf eine neue zeile geben? Kann ich es vielleicht irgendwie trennen also zum beispiel sowas:
          $schleife =~ s/[/Privat][/Hauptseite]/[/Privat]\n/g;
          ?
          Ich hoffe auch hier kann man mich verstehen?

          1. Ich hoffe auch hier kann man mich verstehen?

            Zunächst, Ich weiss nicht, wie sinnvoll es ist, ein File in einen Array zu speichern.
            Weiter gilt: split() ist langsam bei perl. Ich bevorzuge eine RE.

              
            my @data;  
            while(<FILEHANDLE>){  
              my %temp = ();          # Wir brauchen einen neuen hash  
              #ich bearbeite jetzt jede Zeile = Record  
              # Die folgende RE hat eine Backreferenz \1 auf $1  
              while($_ =~ s#\[([^\[\]]+?)\](.*?)\[/\1\]##g ){  
                $temp{$1} = $2 || '';  
              }  
              # an dieser Stelle kannst jetzt mit $temp arbeiten  
              # ...  
              # oder wenn du es in einem Array wirklich speichern musst ???  
              # wir speichern die Referenz des Hashes im Array  
              push( @data, \%temp);  
            }
            

            nochmals die RE etwas deutlicher

              
            s#\[  
                ([^\[\]]+?)  
              \]  
                (.*?)  
              \[  
                /\1  
              \]##gx  
            
            

            mfg Beat

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