Dirk: <STDIN> abfangen

hi,

ich hab folgendes problem und weder im forumsarchiv noch sonstwo 'ne lösung gefunden:

ich möchte, daß eingehende emails an einen bestimmten user sofort nach eingang von einem script weiterverarbeitet werden. dazu hab ich 'nen alias angelegt (eintrag in /etc/aliases: user_xy: "|/usr/bin/perl /usr/local/user_xy/cgi-bin/mailbox.pl"). code in mailbox.pl:
<schnipp>
my $data = <STDIN>;
open(MAIL, ">/usr/local/user_xy/mailbox/test.txt");
print MAIL "$data";
close(MAIL);
<schnapp>
das klappt auch soweit...bis zum ende der ersten, übergebenen zeile, mehr steht nämlich in test.txt nicht drin. eine mail incl. headers besteht allerdings aus vielen zeilen. ich weiß, daß in der vordef. variable $/ das newslinezeichen voreingestellt ist, welches ich auch ändern kann, aber in was? oder besser: wann weiß ich, daß die eingabe beendet ist? oder kann ich schon vorher das newslinezeichen aus der eingabe eliminieren?

für lösungsvorschläge wäre ich sehr dankbar.

gruß,

Dirk

  1. Hallo,

    das klappt auch soweit...bis zum ende der ersten, übergebenen zeile, mehr
    steht nämlich in test.txt nicht drin.

    Kein Wunder. Du liest ja mit

    my $data = <STDIN>;

    Auch nur eine Zeile ein.
    Viel besser waere wohl

    while(<STDIN>) {
      print OUTFILE $_;
    }

    oder

    {
     local $/;
     print OUTFILE <STDIN>;
    }

    Mehr zu $/ gibts in `perldoc perlvar'

    Gruesse,
     CK

  2. hi,

    Moin Moin !

    ich hab folgendes problem und weder im forumsarchiv noch sonstwo 'ne lösung gefunden:

    ich möchte, daß eingehende emails an einen bestimmten user sofort nach eingang von einem script weiterverarbeitet werden. dazu hab ich 'nen alias angelegt (eintrag in /etc/aliases: user_xy: "|/usr/bin/perl /usr/local/user_xy/cgi-bin/mailbox.pl"). code in

    ^---- warum liegt das Script in cgi-bin, wenn es vom Mailer aufgerufen wird ? Da hat es nichts verloren!

    mailbox.pl:

    <schnipp>
    my $data = <STDIN>;

    "Liebes Perl, lies bitte *eine* Zeile aus dem Dateihandle STDIN."

    open(MAIL, ">/usr/local/user_xy/mailbox/test.txt");
    print MAIL "$data";

    ^-- Interpolation (double quotes) ist hier Unsinn.

    close(MAIL);

    Warum schreibst Du das in Perl ?

    in /etc/aliases:

    user_xy: | cat - > /usr/local/user_xy/mailbox/text.txt

    Ansonsten, in Perl:

    my $data=join ('',<STDIN>);
    ^-- alles in einem String

    oder so:

    open(MAIL, ">/usr/local/user_xy/mailbox/test.txt");
    my $line;
    while (defined ($line=<STDIN>)) {
      print MAIL $line;
    }
    close(MAIL);

    <schnapp>
    das klappt auch soweit...bis zum ende der ersten, übergebenen zeile, mehr steht nämlich in test.txt nicht drin. eine mail incl. headers besteht allerdings aus vielen zeilen. ich weiß, daß in der vordef. variable $/ das newslinezeichen voreingestellt ist, welches ich auch ändern kann, aber in was? oder besser: wann weiß ich, daß die eingabe beendet ist? oder kann ich schon vorher das newslinezeichen aus der eingabe eliminieren?

    für lösungsvorschläge wäre ich sehr dankbar.

    Aber sicher doch: Lies mal das eine oder andere gute Perl-Buch, für's erste tut's aber auch die mitgelieferte Doku.

    Alexander

    gruß,

    Dirk