在我的脚本中引用第2行到最后一行。出于某种原因,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";'
答案 0 :(得分:3)
export perlPort
perl -e '
...
my $pid = MyWebServer->new($ENV{perlPort})->background();
'
答案 1 :(得分:1)
您仍然可以将命令行参数传递给脚本。将$perlPort
替换为$ARGV[0]
,然后将脚本称为
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
最佳的想法是简单地使用脚本文件,而不是尝试在命令行上构建脚本。
答案 2 :(得分:0)
perl -e '
...
my $pid = MyWebServer->new('$perlPort')->background();
...
答案 3 :(得分:0)
您可以使用-s
开关传递变量。见http://perldoc.perl.org/perlrun.html
perl -se '
...
my $pid = MyWebBrowser->new($perlPort)->background();
...' -- -perlPort="$perlPort"