【问题标题】:Passing bash variable into inline perl script将 bash 变量传递到内联 perl 脚本
【发布时间】:2016-10-29 20:56:22
【问题描述】:

在我的脚本中引用倒数第二行。由于某种原因,Perl 无法访问变量 $perlPort 我该如何解决这个问题?注意:$perlPort 是我的 perl 脚本之前的 bash 变量位置

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";'

【问题讨论】:

  • 和你写'kill $pid'的方式一样,你为什么不写'$perlPort'
  • $perlPort => $ENV{perlPort}

标签: bash perl webserver centos7


【解决方案1】:
export perlPort
perl -e '
...
my $pid = MyWebServer->new($ENV{perlPort})->background();
'

【讨论】:

    【解决方案2】:

    您可以使用-s 开关来传递变量。见http://perldoc.perl.org/perlrun.html

    perl -se '
    ...
    my $pid = MyWebBrowser->new($perlPort)->background();
    ...' -- -perlPort="$perlPort" 
    

    【讨论】:

      【解决方案3】:

      您仍然可以将命令行参数传递给您的脚本。将$perlPort 替换为$ARGV[0],然后调用你的脚本为

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

      注意另一个问题:您不能在bash 的单引号字符串中包含单引号。您可以通过使用$'...'-quoted 字符串作为 Perl 的参数来解决此问题,可以包含转义的单引号。如果您的脚本不需要从标准输入中读取,最好让perl 从此处的文档中读取。

      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
      

      最好的想法是简单地使用脚本文件,而不是尝试在命令行上构建脚本。

      【讨论】:

        【解决方案4】:
        perl -e '
           ...
        my $pid = MyWebServer->new('$perlPort')->background();
           ...
        

        【讨论】:

        • 不带引号的参数扩展会受到分词和路径名扩展的影响。 intended 值(整数)是安全的,但这很脆弱。
        猜你喜欢
        • 1970-01-01
        • 2011-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多