2013-03-13 5 views
1

У меня есть короткий сценарий test.plКак я могу подавить предупреждающие сообщения, полученные методом Getopt :: Std :: getopts?

#!/usr/bin/perl 
use locale; 
use encoding 'utf-8'; 

use Getopt::Std; 

getopts("dei") or print STDERR "TRALALALALA\n"; 
print"@ARGV\n"; 

мне нужно подавить Unknown option: сообщения, сгенерированные getopts и получить только мое TRALALALALA на STDERR.

+0

от чтения источника getopts это невозможно без переопределения 'CORE :: warn' или установки обработчика предупреждения – user1937198

+2

' Getopt :: Long' имеет параметр 'pass_through', который подавляет сообщение« Неизвестная опция: ». – toolic

ответ

6
{ 
    local $SIG{__WARN__} = sub { }; # Supress warnings 
    getopts("dei") 
     or print STDERR "TRALALALALA\n"; 
} 

Или вы могли бы даже встроить «TRALALALALA» в предупредит обработчика:

{ 
    local $SIG{__WARN__} = sub { print STDERR "TRALALALALA\n" }; 
    getopts("dei"); 
} 
0

Вы также можете локализовать *::STDERR и открыть его в буфер в блоке, как так:

@ARGV = qw(-i -a -g); 
{ open(local *STDERR, '>', \(my $stderr)) 
     or warn('Could not open to string!') 
     ; 
    getopts('ig'); 
    say '$stderr=' . $stderr; 
} 

print STDERR 'STDERR => out';