2
%use IPC::Run3;
%my $a;
%run3 ['echo','hello'],\undef,\$a;
<% $a %>

上記のコードは、 で説明されているように、スタンドアロン スクリプトからmason使用すると非常にうまく機能します。残念ながら、 で実行すると、 は空の文字列になります。以下は私のMasonHTML::Mason::Adminperl_mode$ahttpd.conf

 Alias /mason_book /home/charlse/f/books/mason_book
 <Location /mason_book>
    SetHandler perl-script
    AddHandler perl-script .mas
    PerlHandler HTML::Mason::ApacheHandler
    PerlAddVar  MasonCompRoot  "mason_book => /home/charles/f/books/mason_book"
 </Location>
 <Directory "/home/chunywan/f/books/mason_book">
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
 </Directory>

ところで

 %use IPC::Run qw(run timeout);
 %my @cmd=qw(echo hello world);
 %my ($in,$out,$err);
 %run(\@cmd, \$in, \$out, \$err) or die "cat: $?";
 <pre>
   out <% $out %>
 </pre>

IPC::Runスタンドアロンモードとモードの両方でどちらがうまく機能するかを試してみましたmod_perlIPC::Runの代わりに使用するには、すべてのソース コードを更新する必要があるようですIPC::Run3

4

1 に答える 1

2

解決策は、一時的に STDIN/STDOUT を再度開き、コマンドが終了したら閉じることだと思います。

use IPC::Run3;
my $a;

#save off existing stdin/out
my ($save_stdin,$save_stdout);
open $save_stdin, '>&STDIN';
open $save_stdout, '>&STDOUT';

#open it again as the "normal things"
open STDIN, '>&=0';
open STDOUT, '>&=1';
run3 ['echo','hello'],\undef,\$a;

#clean up after yourself
close(STDIN);
close(STDOUT);
open STDIN, '>&', $save_stdin;
open STDOUT, '>&', $save_stdout;

IPC::Open3 で同じ問題に遭遇し、ここで解決しました: https://stackoverflow.com/a/24311232/312208

于 2014-06-19T16:09:32.197 に答える