roger: am Textende LF anfügen

Abend,

ich habe ein kleines Problem, sehe aber den Fehler nicht

if ($text =~ /^\n/) {$text = "$text\n";}  # wenn kein newline am Ende dann hinzufuegen  

Sollte... tut aber nicht, und ich sehe es nicht :-)

roger

  1. Tach,

    if ($text =~ /^\n/) {$text = "$text\n";}  # wenn kein newline am Ende dann hinzufuegen

      
    also ich vermeide ja normalerweise RegExps, wenn ich kann, aber für mich sieht es so aus, als matchte deine auf Texte, die mit einem Zeilenumbruch anfangen.  
      
    mfg  
    Woodfighter
    
    1. Moin!

      Tach,

      if ($text =~ /^\n/) {$text = "$text\n";}  # wenn kein newline am Ende dann hinzufuegen

      
      >   
      > also ich vermeide ja normalerweise RegExps, wenn ich kann, aber für mich sieht es so aus, als matchte deine auf Texte, die mit einem Zeilenumbruch anfangen.  
        
      Obendrein muss man sich ja fragen:  
        
      - Was ist die korrekte Darstellung für "Linefeed" innerhalb eines regulären Ausdrucks?  
      - Wie kriegt man den regulären Ausdruck so konfiguriert, dass sie in diesem Multiline-Kontext funktionieren?  
        
       - Sven Rautenberg
      
      1. Fein mitgedacht; "\n" in einer Regex ist in der Vielzahl der Anwendungsfälle zu schwammig. Die Fallen werden in PBP Kapitel 12 erläutert. Es wird empfohlen, immer die Flags /m, /s und /x zu setzen.

        Die spezifische Aufgabe des OP strikt-interpretiere ich so: logisches Newline anhängen, wenn kein physisches Linefeed am Ende vorhanden.

          
        require 5.006;  
        use charnames qw(:full);  
        $text .= "\n" unless $text =~ /\N{LF} \z/msx;  
        
        

        Besser aber, man matcht der Symmetrie halber auch auf logisches Newline. Die Lösung ist verblüffend einfach, wenn man weiß, wie es geht. Siehe http://p3rl.org/rebackslash.

          
        require 5.010;  
        $text .= "\n" unless $text =~ /\R \z/msx;  
        
        

        Für die standardgemäße, 100%ig korrekte Behandlung von Zeilenumbrüchen kommt man um http://p3rl.org/Unicode::LineBreak nicht herum.

  2. Moin roger,

    warum schaust du dir nicht einfach nur das letzte Zeichen des Strings an?

    my $s = 'Zeichenkette';  
      
    print substr($s, -1), "\n";    # Ausgabe: e
    

    Viele Grüße,
    Robert