2016-10-29 12 views
2

スクリプトの2行目から最後の行を参照してください。何らかの理由でPerlが変数$perlPortにアクセスできない場合はどうすればこの問題を解決できますか?注:$perlPortあなたはまだあなたのスクリプトにコマンドライン引数を渡すことができ、私のperlスクリプトbash変数をインラインperlスクリプトに渡す

perl -e ' 
{ 
    package MyWebServer; 
    use HTTP::Server::Simple::CGI; 
    use base qw(HTTP::Server::Simple::CGI); 
    my %dispatch = (
     "/" => \&resp_hello, 
    ); 


    sub handle_request { 
     my $self = shift; 
     my $cgi = shift; 
     my $path = $cgi->path_info(); 
     my $handler = $dispatch{$path}; 
     if (ref($handler) eq "CODE") { 
      print "HTTP/1.0 200 OK\r\n"; 
      $handler->($cgi); 
     } else { 
      print "HTTP/1.0 404 Not found\r\n"; 
      print $cgi->header, 
      $cgi->start_html("Not found"), 
      $cgi->h1("Not found"), 
      $cgi->end_html; 
     } 
    } 


    sub resp_hello { 
     my $cgi = shift; # CGI.pm object 
     return if !ref $cgi; 
     my $who = $cgi->param("name"); 
     print $cgi->header, 
      $cgi->start_html("Hello"), 
      $cgi->h1("Hello Perl"), 
      $cgi->end_html; 
    } 
} 


my $pid = MyWebServer->new($perlPort)->background(); 
print "Use 'kill $pid' to stop server.\n";' 
+1

同じように、あなたは '' $ perlPort ''と書かないと '' $ pid ''を書いていますか? –

+1

'$ perlPort' =>' $ ENV {perlPort} ' –

答えて

0
perl -e ' 
    ... 
my $pid = MyWebServer->new('$perlPort')->background(); 
    ... 
+0

引用符で囲まれていないパラメータ拡張は、単語分割とパス名展開の対象です。 *意図した*値(整数)は安全ですが、これは壊れやすいものです。 – chepner

3
export perlPort 
perl -e ' 
... 
my $pid = MyWebServer->new($ENV{perlPort})->background(); 
' 
1

前に、bashの可変ロケーションです。 $ARGV[0]$perlPortを交換し、その後、

perl -e $' ... 
     my $pid = MyWebServer->new($ARGV[0])->background(); 
     print "Use \'kill $pid\' to stop server.\n";' "$perlPort" 

としてスクリプトあなたを呼び出す他の問題に注意してください:あなたはbashで、単一引用符で囲まれた文字列内の単一引用符を含めることはできません。この問題を回避するには、$'...'という名前の文字列をPerlの引数として使用します。には、にエスケープされた単一引用符が含まれています。あなたのスクリプトが標準入力から読み込む必要がない場合は、perlをhere-documentから読み込むことをお勧めします。

perl <<'EOF' "$perlPort" 
{ 
package MyWebServer; 
use HTTP::Server::Simple::CGI; 
... 
my $pid = MyWebServer->new($ARGV[0])->background(); 
print "Use 'kill $pid' to stop server.\n"; 
EOF 

最高アイデアは、単にコマンドライン上でスクリプトを構築しようとしているのではなく、スクリプトファイルを使用することです。

0

-sスイッチを使用して変数を渡すことができます。 http://perldoc.perl.org/perlrun.html

perl -se ' 
... 
my $pid = MyWebBrowser->new($perlPort)->background(); 
...' -- -perlPort="$perlPort" 
関連する問題