print: auf verschiedene Channels schreiben

12/02/2012 - 20:40 von Andre Tann | Report spam
Servus zusammen,

ich möchte mir gerne eine Subroutine bauen, die einen übergebenen String
auf mehrere Channels schreibt. Hier ist meine Vorstellung, die aber
leider nicht funktioniert:


#!/usr/bin/perl
use strict;
use warnings;

sub printit;

printit ("Hier ist meine Meldung","STDOUT","FH1", "FH2");

sub printit {
my $meldung = $_[0];
shift;
foreach (@_) {
print $_ "Meldung: $meldung";
}
}


Obwohl nach meinem Verstàndnis in $_ die Channels enthalten sind, auf
die ich die Meldung schreiben möchte, kriege ich diese¹ Fehlermeldung.
Was habe ich falsch verstanden?

Letztlich versuche ich im Kern, das nachzustellen, was "tee" macht: auf
STDOUT und in eine Datei gleichzeitig zu schreiben.

Danke und Gruß!




¹
Can't use string ("STDOUT") as a symbol ref while "strict refs" in use
at ./myfirstperl.pl line 13.

Andre Tann
 

Lesen sie die antworten

#1 Peter J. Holzer
12/02/2012 - 21:41 | Warnen spam
On 2012-02-12 19:40, Andre Tann wrote:
#!/usr/bin/perl
use strict;
use warnings;

sub printit;

printit ("Hier ist meine Meldung","STDOUT","FH1", "FH2");

sub printit {
my $meldung = $_[0];
shift;
foreach (@_) {
print $_ "Meldung: $meldung";
}
}


Obwohl nach meinem Verstàndnis in $_ die Channels enthalten sind, auf
die ich die Meldung schreiben möchte, kriege ich diese¹ Fehlermeldung.
Was habe ich falsch verstanden?



Ein String ist kein Filehandle, STDOUT nicht das gleiche wie "STDOUT".

Es funktioniert, wenn Du eine Referenz auf den Handle übergibst:

printit ("Hier ist meine Meldung", \*STDOUT, \*FH1, \*FH2);

Du solltest aber "bare filehandles" meiden und stattdessen lexikalische
Filehandles verwenden, also statt

open(FH1, '>', 'file1.log');

solltest Du

open(my $fh1, '>', 'file1.log');

schreiben. $fh1 kannst Du dann wie jede andere Variable übergeben:

printit ("Hier ist meine Meldung", $fh1);

(Lexikalische Filehandles gibt es seit Perl 5.6, also seit ca. 12
Jahren)

hp


_ | Peter J. Holzer | Deprecating human carelessness and
|_|_) | Sysadmin WSR | ignorance has no successful track record.
| | | |
__/ | http://www.hjp.at/ | -- Bill Code on

Ähnliche fragen