Pluto: die Funktion

Hallo,

ich habe folgenden system call:
system("$CMD >/dev/null") == 0 or die "$CMD failed: $?";
wobei es mit einem "normalen" open diesselbe Frage ist:
open (CMD, "$CMD |") or die "Can't run program: $!\n";

Wie kann ich den output von die eine Funktion umleiten?
Ich hab eine subroutine für meine Ausgaben.

sub LOGG  
{  
        print LOG "$logtime\t@_\n";  
}

Und nun würde ich gerne sowas wie...
open (CMD, "$CMD |") or die LOGG("Can't run program: $!\");
... was aber nicht funktioniert.

Jemand eine Idee, wie man das am besten löst?

Danke,
Pluto

  1. Hi Pluto!

    Und nun würde ich gerne sowas wie...
    open (CMD, "$CMD |") or die LOGG("Can't run program: $!\");
    ... was aber nicht funktioniert.

    Du hast nicht verstanden, wie die Verknüpfung zweier Statements mit or funktioniert.

    Jemand eine Idee, wie man das am besten löst?

    Zwei Ausdrücke seien mit or verknüpft:
    $expr_1 or $expr_2

    Liefert $expr_1 true zurück, wird der zweite Ausdruck gar nicht erst ausgeführt, da der Interpreter erkennt, dass $expr_2 den Gesamtausdruck nicht weiter beeinflussen kann.
    Nur wenn $expr_1 false liefert, muss $expr_2 ausgewertet werden.

    Du möchtest also nicht "die" _und_ "LOGG" benutzen, sondern "die" mit "LOGG" ersetzen.

    Jetzt klarer?

    MfG H☼psel

    --
    "It's amazing I won. I was running against peace, prosperity, and incumbency."
    George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
    Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
    1. Hallo,

      Du möchtest also nicht "die" _und_ "LOGG" benutzen, sondern "die" mit "LOGG" ersetzen.

      Glaub' ich nicht. Das Programm soll schon mit "die" sterben, aber dabei noch einen Seufzer in die Logdatei hauchen. Das klappt normalerweise auch.

      Mein ersten Perl-Scripts fingen z.B. immer so ähnlich an:
      say ( $I_am .' at work...' ); &_get_filenames or die shouting ( Arrrgh, Damned, $foobar );

      Gruß, Don P

  2. Tach auch.

    ich habe folgenden system call:
    system("$CMD >/dev/null") == 0 or die "$CMD failed: $?";
    wobei es mit einem "normalen" open diesselbe Frage ist:
    open (CMD, "$CMD |") or die "Can't run program: $!\n";

    Wie kann ich den output von die eine Funktion umleiten?
    Ich hab eine subroutine für meine Ausgaben.

    die() sorgt für eine Exception, die du abfangen willst. Was du in anderen Sprachen als try {} catch () { ...} kennst, kennt perl als

    eval {
         die "blablabla";
    };

    if ($@) {
       print $@; # print "blablabla";
    }

    Oder mißversteh ich deine Frage?

    Bis die Tage,
    Matti

    1. eval {
           die "blablabla";
      };

      if ($@) {
         print $@; # print "blablabla";
      }

      Dies ist buggy, weil $@ nicht lokalisiert wurde. Immer so schreiben:

        
      eval {  
          die "blablabla";  
          1;  
      } or do {  
          print $@;    # print "blablabla";  
      }  
      
      

      oder besser gleich

        
      use Try::Tiny;  
      try {  
          die "blablabla";  
      } catch {  
          print $_;    # Ausnahmeobjekt ist in $_  
      };  
      
      
  3. hi,

    Wie kann ich den output von die eine Funktion umleiten?

    Die Rückgabe der open() auswerten, also nicht in einer Zeile, sondern auf eine Variable nehmen

    my $status = open(...

    Dann hast Du im Argument von die() ja schon ein bischen was eigenes Geschriebenes und $!, das gibts Du in Deine Log-Funktion.

    Hmmm: Vermeide Systemcalls, gehts wirklich nicht anders?

    Hotti

    1. hi,
      ,

      Wie kann ich den output von die eine Funktion umleiten?

      Die Rückgabe der open() auswerten, also nicht in einer Zeile, sondern auf eine Variable nehmen

      Oder einfach die() in Deiner Zeile durch Deine eigene Funktion ersetzen, das die() dann innerhalb Deiner Funktion() am Ende.

      Hotti

  4. Und nun würde ich gerne sowas wie...
    open (CMD, "$CMD |") or die LOGG("Can't run program: $!\");
    ... was aber nicht funktioniert.

    Wieso sollte das nicht funktionieren?

    Struppi.