die Funktion
Pluto
- perl
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
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
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
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
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 $_
};
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
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
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.