mmueller: Array, Zeilennummer auslesen

Hallo,
ich bin absoluter Anfänger und habe folgendes Problem.
Ich habe eine recht umfangreiche Input Datei (kommt aus Abaqus) und muss mittels eines Perl Skripts an einer bestimmten Stelle ein paar Sachen einfügen.
So, ich habe mir gedacht ich realisiere das mit dem splice Befehl. Problem jedoch ist, dass die Zeile die ich hierfür angeben muss variiert. Das heißt ich müsste zunächst diese Zeile suchen und sie anschließend irgendwie auslesen (also die Nummer). Alternativ habe ich mir gedacht es mit einem regulären Ausdruck zu machen, aber kann ich bei diesen auch einfügen? ich habe bisher nur vom ersetzen gelesen.

freue mich über antworten

danke

grüße
max

  1. Hi Max!

    Wenn du den regulären Ausdruck bilden kannst, der dir die richtige Stelle findet, dann hast du doch schon gewonnen:
    Sei dieser der Art
    myReplaceString ~= s/(Anfangsuchmuster)(EndeSuchmuster)/$1 derEinfügeString$2/
    Wichtig: die () erzeugen (setzen) die $1 $2 ..., mit den Teile aus myReplaceString, die auf Anfangsuchmuster und EndeSuchmuster gepasst haben.
    Anmerkung: natürlich kannst du auch eines der beiden Suchmuster weglassen, dann folgt:
    myReplaceString ~= s/(Anfangsuchmuster)/$1 derEinfügeString/
    myReplaceString ~= s/(EndeSuchmuster)/derEinfügeString$1/

    Viel Spass,
    Richard

    1. hey super,

      vielen dank für die schnelle antwort. den regulären ausdruck hab ich noch nicht so wie er sein soll, aber das grundprinzip funktioniert. vielen vielen dank

      grüße
      max

    2. Diesbezüglich habe ich noch eine frage... (sorry, der anfänger...)

      ich habe meine datei, die ich als array einlese. jetzt habe ich meinetwegen die stelle
      test
      darunter
      und da möchte ich dazwischen jetzt was ersetzen. wenn ich das ganze jetzt aber mittels

      myReplaceString ~= s/(test)\n(darunter)/$1 derEinfügeString$2/

      das ganze versuche anzusprechen, klappt das. wenn ich nur das anfangssuchmuster eingebe funktioniert es, aber ich brauche auch das endmuster. jemand eine idee?

      vielen dank für eure hilfe!

      grüße
      max

      Hi Max!

      Wenn du den regulären Ausdruck bilden kannst, der dir die richtige Stelle findet, dann hast du doch schon gewonnen:
      Sei dieser der Art
      myReplaceString ~= s/(Anfangsuchmuster)(EndeSuchmuster)/$1 derEinfügeString$2/
      Wichtig: die () erzeugen (setzen) die $1 $2 ..., mit den Teile aus myReplaceString, die auf Anfangsuchmuster und EndeSuchmuster gepasst haben.
      Anmerkung: natürlich kannst du auch eines der beiden Suchmuster weglassen, dann folgt:
      myReplaceString ~= s/(Anfangsuchmuster)/$1 derEinfügeString/
      myReplaceString ~= s/(EndeSuchmuster)/derEinfügeString$1/

      Viel Spass,
      Richard

      1. Hi Max!

        myReplaceString ~= s/(test)\n(darunter)/$1 derEinfügeString$2/

        Also, da gibts jetzt folgende Möglichkeiten:
        1. Du kannst das Array mittels join (mit trennzeichen \n)(perl befehl) zusammenfassen und dann suchen (nicht sehr performant).
        2. Du kannst mittels regular expression "match" iterativ immer zwei aufeinanderfolgende Zeilen untersuchen, alla (Syntax ungeprüft...)
        my $ arraylen = @filelines;
        for ($count=0; $count<$arraylen-1; $count++)
        {
           if ($filelines[count]~=m/test$/ && $filelines[count+1]~=m/^darunter/)
           {
              $filelines[count] = $filelines[count] . "derEinfügeString"
           }
        }
        3. Du nimmst nicht perl, sondern lex...

        Grüsse,
        Richard

      2. ich habe meine datei, die ich als array einlese. jetzt habe ich meinetwegen die stelle

        eine grosse Datei in ein Array einzulesen ist nicht unbedingt empfehlenswert.

        test
        darunter
        und da möchte ich dazwischen jetzt was ersetzen. wenn ich das ganze jetzt aber mittels

        Die Frage hier ist, ob du darunter auch kennen musst oder ob es reicht test zu finden. Dann wäre es einfacher die Datei zeilenweise zu lesen und gleichzeitig in eine Kopie zu schreiben und an der Fundstelle den Einfügestring einzufügen.

        grüße
        max

        Hi Max!

        Ach, und bitte lasse nur das stehen aorauf deine Antwort sich bezieht

        Struppi.

  2. Ich habe eine recht umfangreiche Input Datei (kommt aus Abaqus) und muss mittels eines Perl Skripts an einer bestimmten Stelle ein paar Sachen einfügen.

    Das würde ich nicht tun, sondern während du die eine Datei liest, eine zweite Datei schreiben inkl. den Ergänzungen.

    Struppi.

    1. ja ne, die original datei lass ich schon ganz :) oder hast du das gemeint?

  3. Ich habe eine recht umfangreiche Input Datei (kommt aus Abaqus) und muss mittels eines Perl Skripts an einer bestimmten Stelle ein paar Sachen einfügen.

    Für fast alle Deine Teilprobleme sollte Tie::File einen Ansatz bieten.

    Siechfred

  4. so, mir ist klar warum das nicht mit foreach funktioniert. wie kann ich das problem dann lösen? ich habe es jetzt mit

    for(@lines)
     {
      if(/(test)\n(einszwei)/)
       { print "yeah"; }
     }

    probiert, aber das geht auch nicht?

    vielen dank für eure antworten
    gruß max

    Hallo,
    ich bin absoluter Anfänger und habe folgendes Problem.
    Ich habe eine recht umfangreiche Input Datei (kommt aus Abaqus) und muss mittels eines Perl Skripts an einer bestimmten Stelle ein paar Sachen einfügen.
    So, ich habe mir gedacht ich realisiere das mit dem splice Befehl. Problem jedoch ist, dass die Zeile die ich hierfür angeben muss variiert. Das heißt ich müsste zunächst diese Zeile suchen und sie anschließend irgendwie auslesen (also die Nummer). Alternativ habe ich mir gedacht es mit einem regulären Ausdruck zu machen, aber kann ich bei diesen auch einfügen? ich habe bisher nur vom ersetzen gelesen.

    freue mich über antworten

    danke

    grüße
    max

    1. sorry, hab den topic verwechselt