SkÃ¥ne Sjælland Linux User Group - http://www.sslug.dk Förstasida   Anmälning   Postarkiv   Forum   Kalender   Sök
MhonArc Dato: [Date Prev] [Kronologisk oversigt] [Date Next]   TrÃ¥d: [Date Prev] [Oversigt trÃ¥de] [Date Next]   MhonArc
 

Re: [PERL] Ignorere stdin hvis intet er angivet.



Bjoern Bille Hoejte <sslug@sslug> writes:

> $rin = $rout = '';
> vec($rin, fileno(STDIN), 1) = 1;
> $readable = select($rout=$rin, undef, undef, 0) | -f $ARGV[0];
> if ($readable) {
> 	while (<>) {
> 		print;
> 	}
> } else {
> 	printf("No standard input detected\n");
> }

(
  *Aldrig* brug printf hvis det ikke er nødvendigt. Det er en dårlig
  vane og sløver programmet betragteligt ned.
)

Jeg ville foretrække at bruge IO::Select istedet. Følgende burde være
helt ækvivalent.

#!perl

use IO::Select;
my $s = new IO::Select (\*STDIN);

if ($s->can_read(0)) {
    while(<>) {
        ...
    }
} else {
    print "No stdin\n";
__END__


En lidt anden måde at gøre det på er:

#!perl

# Hvis funktionen modtager en SIGALRM udføres funktionen time_out
sub time_out { die "TIME-OUT" }
$SIG{ALRM} = \&time_out;

eval { 
    alarm(1); # Få OS'et til at sende en SIGALRM om 1 sekund
    while(<>) {
        alarm(0) ; # Aflys ovenstående
        ...
    }
}
if ($@ =~ /TIME-OUT/) {
    print "No stdin\n"
}
__END__

Måske burde man lige sørge for at alarm(0) kun blev kaldt en gang.

Select-måden er nok pænest.


-- 
 Peter Makholm     |     If you can't do any damage as root, are you still
 sslug@sslug |                                          really root?
 http://hacking.dk |                       -- Derek Gladding about SELinux


 
Förstasida   Anmälning   Postarkiv   Översikt   Kalender   Sök

 
 
Fel och synpunkter angående webb-sidorna skickas till <www_admin>. Senaste ändring 2005-08-10, klockan 19:55
Denna sidan underholds av MHonArc .