2015-06-20 16 views
1

如何獲得POD部分到一個變量:如何將POD節獲取到字符串中?

pod2usage(-verbose => 99, -sections => "DESCRIPTION"); # Goes on STDOUT 

=head1 DESCRIPTION 

    A description 

=cut 

我只是想分配DESCRIPTIONSTDOUT而不是顯示它的變量。

我目前正在調查這種方式。它是複雜的,這是行不通的:

sub pod2scalar { 
    use File::Temp 'tempfile'; 
    my ($fh, $filename) = tempfile(UNLINK => 1); 
    open OLDOUT, '>&STDOUT'; 
    { 
     local *STDOUT; 
     open STDOUT, ">", $filename or warn "Can't open $filename: $!"; 

     #pod2usage(@_); # Doesn't work... I don't know why... 
     print STDOUT "This is captured in \$str"; 

     close STDOUT; 
    } 
    open STDOUT, '>&OLDOUT' or die "Can't restore stdout: $!"; 
    close OLDOUT or die "Can't close OLDOUT: $!"; 
    open $fh, "<", $filename or warn "Can't open $filename: $!"; 
    my $str = do { local $/, <$fh> }; 
    close $fh; 
    $str; 
}  

回答

4

您可以打開一個標量輸出由地方文件名傳遞引用open

然後你就可以提供文件句柄作爲的pod2usage-output選項的值以獲取發送到您的標量

的數據你也想設置'NOEXIT'-exitval,讓你有機會使用您捕捉什麼

它看起來像這樣

use Pod::Usage 'pod2usage'; 

sub pod2scalar { 
    open my $fh, '>', \my $text; 
    pod2usage(@_, -output => $fh, -exitval => 'NOEXIT'); 
    $text; 
} 
+0

我不知道推來推去'@ _'是一個很好的做法。 – bessarabov

+1

@bessarabov:爲什麼呢?我已經刪除了它,因爲它更簡潔,如果我只是在過程調用中添加新參數,但是操作'@ _'沒有任何傷害。畢竟,通過使用'shift'從數組中提取參數是非常普遍的做法,所以如果你能從'@ _'中移除*元素,那麼添加*就不會有問題! – Borodin

+0

嗯...我從來沒有使用@_作爲一個正常的數組,我只用它作爲一個東西來訪問傳遞給子參數。現在我試圖構建一些因直接使用@_而中斷的示例,但我無法做到這一點。也許可以使用它,但我從來沒有見過這樣的用法。 – bessarabov

2

有一位優秀的Perl庫Capture::Tiny,它簡化了節能標準輸出/標準錯誤。

默認pod2usage退出程序,所以您必須指定-exitval => "noexit"

這是一個完整的工作示例:

#!/usr/bin/perl 

use strict; 
use warnings; 
use feature 'say'; 

use Pod::Usage; 
use Capture::Tiny ':all'; 

=head1 DESCRIPTION 

A description 

=cut 

my $stdout = capture_merged { 
    pod2usage(-verbose => 99, -sections => "DESCRIPTION", -exitval => "noexit"); 
}; 

say "## Captured"; 
say $stdout; 

__END__ 

This will output: 

## Captured 
Description: 
    A description