Anzeige:
Ergebnis 1 bis 5 von 5

Thema: [Perl] Zeilenumbruch bei Parameterübergabe

  1. #1
    Registrierter Benutzer
    Registriert seit
    11.06.2004
    Beiträge
    21

    [Perl] Zeilenumbruch bei Parameterübergabe

    Hallo allerseits,

    ich habe ein simples Skript, das über MIME::Lite parametrisiert (Getopt::Long) Mails versenden soll. Wenn ich den Body einer Nachricht mit einem '\n' übergebe, wird dieser aber nicht als Zeilenumbruch in der Mail versendet. Setze ich den Body im Skript selbst auf den gleichen String, sehe ich in der versendeten Mail den gewünschten Zeilenumbruch.

    Hier mal das besagte Skript zum selber nachvollziehen:

    Code:
    #!/usr/bin/perl
    
    use strict;
    use Getopt::Long;
    use MIME::Lite;
    
    my $server		= '';
    my $user		= '';
    my $password	= '';
    my $to			= '';
    my $from		= '';
    my $subject		= '';
    my $body		= '';
    
    GetOptions("server=s" => \$server, "user=s" => \$user, "password=s" => \$password, "from=s" => \$from, "to=s" => \$to, "subject=s" => \$subject, "body=s" => \$body );
    
    #
    # setzt man hier den gleichen String neu, funktioniert es
    #	
    #$body = "Hallo\nNewline";
    	
    my $msg = MIME::Lite->new(
    		From     => $from,
    		To       => $to,
    		Subject  => $subject,
    		Type     => 'TEXT',
    		Data     => $body
    );
    
    $msg->send('smtp', "$server", Timeout=>60);
    
    exit 0;
    In der Mail steht dann
    Hallo\nNewline
    Aufruf über:

    Code:
    ./test2.pl --body="Hallo\nNewline" --server='mail.example.com' --to='Max Mustermann <max@mustermann.de>' --from='Jon Doe <jon@doe.de>' --subject='foobar'


    Wie bekomme ich das Newline über Getopt::Long richtig übergeben?

    Vielen Dank schonmal für alle Hinweise.

    Viele Grüße, pertze

  2. #2
    Registrierter Benutzer
    Registriert seit
    11.06.2004
    Beiträge
    21
    Das Problem tritt auch bei Getopt::Std und bei der Verwendung von $ARGV[] auf. Aber vielleicht ist es ja gar kein Problem, sondern gewollt...

    ...wie auch immer: ich habe es nun durch einen kleinen Workaround gelöst:
    Code:
    my @nonewlines = split(/\\n/, $body);
    $body = join("\n", @nonewlines);

  3. #3
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Moin,

    das, was Du dem Script übergibst, ist kein Zeilenumbruch, sondern die Zeichenkette "\n".

    So geht es:
    Code:
    jan@jack:~/tmp> cat test.pl
    #! /usr/bin/perl
    use strict;
    use warnings;
    use Getopt::Long;
    my $body = '';
    GetOptions('body=s' => \$body);
    print $body, "\n";
    exit 0;
    jan@jack:~/tmp> ./test.pl --body='Zeile 1
    Zeile 2'
    Zeile 1
    Zeile 2
    Jan

  4. #4
    Registrierter Benutzer
    Registriert seit
    11.06.2004
    Beiträge
    21
    Hallo,

    aber wenn ich im Skript schreibe
    Code:
    $body = "zeile1\nzeile2";
    funktioniert es ja auch. Und ist das in dem Fall nicht auch nur die Zeichenkette "\n" ?

  5. #5
    Registrierter Benutzer
    Registriert seit
    01.04.2009
    Ort
    Essen
    Beiträge
    25
    Du übergibst bei der Shell das hier: "./test2.pl --body="Hallo\nNewline"..."
    Die Shell selber interpoliert aber keine "\n" in Anführungszeichen zu Newlines. Sondern du übergibst deinen Programm über die Shell eine zeichenkette wo ein Backslash gefolgt von einem "n" drin steht. Daher steht dann im Subject auch ein "\n" direkt literal drin, und eben kein Newline Zeichen.

    Die ersetzung von \n => Newline macht also Perl, und auch viele andere Programmiersprachen, allerdiengs nicht die Shell, und dort gibst du ja deinen String an.

    Wenn du ein Newline haben möchtest musst du wirklich Enter drücken. Wahrscheinlich geht es auch irgendwie über ein ANSI Kürzel oder so.
    Geändert von Sid Burn (25-05-2009 um 16:23 Uhr)
    Falsch zu liegen ist kein Misserfolg. Es sollte gefeiert werden, da die Erkenntnis etwas Falsch gemacht zu haben Verstehen und Erkenntnis auf ein neues Level anhebt.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •