我有三个不同的Perl程序。我想访问其他两个Perl程序中第一个程序中存在的变量的值。
我的第一个Perl程序如下所示:
#!/usr/bin/perl
print "Content-Type: text/html; charset=utf-8\n\n";
use CGI;
use Cwd;
use utf8;
$q=new CGI;
$a=$q->param('file');
#chomp($a);
my $ftpname="$a";
此程序从HTML程序的文本中获取值。我需要在我的其他Perl程序中的$ ftpname变量的值。我怎么能这样做?
答案 0 :(得分:0)
解决问题的方法不止一种。
$a
的值保存在文本文件中,然后在其他两个程序中读取该文本文件。$a
的值。然后,您可以使用$a
作为参数调用正确的moduleName :: functionName。一个简单的入门教程是here。 our
关键字和/或导出),然后这个模块是{{ 1}}在所有其他perl脚本中,变量随处可见。见this answer。有关变量范围的更多帮助,请参阅此参考:Coping with Scoping 答案 1 :(得分:0)
您的问题的答案最终是您需要使用会话将状态信息从一个页面保存到下一个页面。 CGI::Session::Tutorial
有助于介绍这一概念和一些早期的替代方案。
下面你会发现两个演示这种做法的脚本。但首先。
始终在您创建的每个perl脚本的顶部包含use strict;
和use warnings;
。这将使您成为更好的编码器,并帮助您更快地发现错误。有关更多原因,请查看:Why use strict and warnings?
因为您正在使用CGI
,所以您还应该使用CGI::Carp
。只需在use CGI;
声明后添加以下行:use CGI::Carp qw(fatalsToBrowser);
使用CGI::Session
在页面之间保存状态信息可以解决您的问题。以下脚本将变量保存在第二个脚本使用的第一个脚本中。您应该能够将其调整为3脚本方案。
您首先输出http标头很好,但让CGI
为您执行此操作。通常,我会说使用print $q->header();
。这将输出与手动操作相同的标题。但是,因为我们希望CGI::Session
能够设置Cookie,所以我将证明使用print $session->header();
代替。
这个名为step1.pl
的第一个脚本设置一个随机变量并将其保存到会话中。一旦设置,它就会提供指向下一步的链接。
#!/usr/bin/perl
use strict;
use warnings;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use CGI::Session;
my $q = CGI->new;
my $session = CGI::Session->new($q) or die CGI->Session->errstr;
print $session->header();
$session->save_param($q, ['dependentvar']);
#$session->load_param($q, ['dependentvar']); # Uncomment this if you want the text field initialized when returning to the form.
# Random Page View Count
my $count = 1 + ($session->param('count') // 0);
$session->param('count' => $count);
print qq{
<html>
<head><title>Step 1</title></head>
<body>
<h3>Step 1</h3>
<p>Goal: Set a random value that must be initialized before proceeding to step 2.</p>
<p>Number of Page views this session: $count</p>
<div><form method="POST">};
print $q->textfield("dependentvar");
print $q->submit("set");
print qq{</form></div>};
if ($q->param('dependentvar')) {
print qq{<div>You have a value set, you can proceed to <a href="step2.pl">step 2</a></div>};
}
print qq{
</body>
</html>};
第二个脚本step2.pl
,它要求在继续之前设置dependentvar,然后让用户对字符串执行一些翻译。
#!/usr/bin/perl
use strict;
use warnings;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use CGI::Session;
my $q = CGI->new;
my $session = CGI::Session->new($q) or die CGI->Session->errstr;
print $session->header();
my $var = $session->param('dependentvar');
# Verify that our dependent variable was set in the previous step.
if (!$var) {
print qq{
<html>
<head><title>Step 2</title></head>
<body>
<h3>Step 2</h3>
<p>You must set a value in <a href="step1.pl">step 1</a> before proceeding with step 2</p>
</body>
<html>};
exit;
}
print qq{
<html>
<head><title>Step 2</title></head>
<body>
<h3>Step 2</h3>
<p>Goal: Take variable from <a href="step1.pl">Step 1</a> and perform some translations on it.</p>
<div><form method="POST">};
print q{<div>} . $q->checkbox('double') . q{</div>};
print q{<div>} . $q->checkbox('reverse') . q{</div>};
print q{<div>} . $q->checkbox('upper') . q{</div>};
print q{<div>} . $q->checkbox('lower') . q{</div>};
print q{<div>} . $q->checkbox('ucfirst') . q{</div>};
print q{<div>} . $q->checkbox('lcfirst') . q{</div>};
print q{<p>} . $q->submit("transform") . q{</p>};
print qq{</form></div>};
if ($q->param('transform')) {
my $newvar = $var;
$newvar x= 2 if $q->param('double');
$newvar = reverse $newvar if $q->param('reverse');
$newvar = uc $newvar if $q->param('upper');
$newvar = lc $newvar if $q->param('lower');
$newvar = ucfirst $newvar if $q->param('ucfirst');
$newvar = lcfirst $newvar if $q->param('lcfirst');
print qq{<div>$var -> $newvar</div>};
}
print qq{
</body>
</html>};
这应该作为会话概念的介绍。还有其他方法可以将变量从一个Web脚本传递到下一个Web脚本,但正如CGI::Session::Tutorial
中所讨论的那样,这种方法非常脆弱。最后,在将此解决方案应用于您的代码之前,请先阅读整个教程。