Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 变量声明可以放在公共脚本中吗_Perl - Fatal编程技术网

Perl 变量声明可以放在公共脚本中吗

Perl 变量声明可以放在公共脚本中吗,perl,Perl,在我开始之前,整个“概念”在技术上可能是不可能的;希望有人能对这些事情有更多的了解,并给我一些建议 使用Perl,您可以通过my/our在脚本开始时“声明”全局变量,因此: my ($a,$b,$c ..) 有几个唯一的变量就可以了。但是我用了大约50个。。。五个脚本使用相同的名称(而不是值)。我不必在每个文件的开头放置巨大的my(…)块,而是想知道是否有一种方法可以在一个脚本中创建它们。注意:声明名称空间,而不是它们的值 我试着将它们都放在一个文件中,顶部是shebang,底部是1,然后尝试

在我开始之前,整个“概念”在技术上可能是不可能的;希望有人能对这些事情有更多的了解,并给我一些建议

使用Perl,您可以通过
my
/
our
在脚本开始时“声明”全局变量,因此:

my ($a,$b,$c ..)
有几个唯一的变量就可以了。但是我用了大约50个。。。五个脚本使用相同的名称(而不是值)。我不必在每个文件的开头放置巨大的
my(…)
块,而是想知道是否有一种方法可以在一个脚本中创建它们。注意:声明名称空间,而不是它们的值

我试着将它们都放在一个文件中,顶部是shebang,底部是1,然后尝试使用“require”、“use”和“do”来加载它们。但是,在某些时候,脚本会抱怨找不到全局包名。(可能“path.pl”正在设置相对于自身的全局空间-其他脚本无法“看到”该空间)

在Google上,有人建议在第二个文件中设置变量,但仍然在调用脚本中设置
my
。。。但这就是我要做的,就是简单地声明一次名称空间,然后在另一个脚本中设置值

**到目前为止,如果我从一个HTML页面中的链接转到一个perl脚本,上面的方法似乎是有效的。但是,当我使用类似的设置通过XHTMLRequest调用脚本时,它在“路径”脚本中找不到$a、$b、$c等

HTML

你想在这里做的是一种样板管理。将变量声明推送到模块或类文件中。这是一个值得称赞的目标。事实上,您应该尽可能多地将样板文件放入另一个模块中。这使得在项目中的许多脚本中保持一致的行为变得容易得多。然而,将变量推入其中并不像您想象的那么容易

首先,
$a
$b
是保留在
排序
块中使用的特殊变量,因此它们不必声明。因此,在这里使用它们不会验证您的测试
require
始终在
@INC
中搜索文件。看

要声明变量,必须在编译时执行<代码>我们的
我的
状态
都在编译时运行,并在词汇范围内使符号合法化。由于模块是一个作用域,
require
do
都为该文件创建了一个作用域,因此无法让
我们的
(更不用说
我的
状态
)回到父作用域来声明符号

这就给你留下了两个选择。将包globals导出回调用脚本,或使用源筛选器对脚本进行munge。这两种都会让你心痛。请记住,它必须在编译时完成

出于对计算机科学的兴趣,以下是你将如何做到这一点(但不要做到这一点)

#boilerplate.pm
严格使用;
使用变量qw/$foo$bar/;
1.
__结束__
#script.pl
严格使用;
使用样板;
$foo=“foo here”;
use vars
是在
strict
生效时声明包全局变量的方式。包全局变量是非作用域(“全局”)的,所以它们在哪个作用域或文件中声明并不重要。(注意:
our
不会创建全局,就像
my
创建词法一样。
our
会为全局创建词法别名,从而公开其中的任何内容。)请注意,boilerplate.pm没有
声明。它将继承任何你想要的东西

第二种使用源过滤器的方法是不可靠的。您可以创建一个模块,动态重写脚本的源代码。有关更多信息,请参阅和。这只适用于真正的脚本,而不是
perl-e…

#boilerplate.pm
包装样板;
严格使用;使用诊断;
使用过滤器::简单;
我的美元
我们的($foo,$bar);
我的($baz);
';
过滤器{s/uu过滤器{uuu/$injection/}
__结束__
#script.pl
严格使用;使用诊断;
使用样板;
__滤器__
$foo=“foo here”;
您可以为代码替换生成任意数量的筛选标记或场景。e、 g.
使用样板qw/D2_装船/

这些是使用标准Perl实现这一点的唯一方法。有一些模块允许您通过各种
B
模块来处理调用范围,但您需要自己处理。谢谢你的提问

首先,词法(
my
)变量只存在于其作用域中。文件是作用域,因此它们只存在于其文件中。你现在正试图解决这个问题,当你发现自己以这种方式与语言作斗争时,你应该意识到你做得不对

您应该避免在程序顶部一次性声明所有变量。在要使用它们的范围附近声明它们,并在尽可能小的范围内声明它们

你说你想“建立一个全球空间”,所以我想你可能误解了什么。如果您想在某个范围内声明一个词法变量,只需这样做。你不必做任何其他事情来实现这一点

与此相反:

my( $foo, $bar, $baz );

$foo = 5;
sub do_it { $bar = 9; ... }
while( ... ) { $baz = 6; ... }
在需要的位置声明变量:

my $foo = 5;
sub do_it { my $bar = 9; ... }
while( ... ) { my $baz = 6; ... }
每个词汇变量都应该存在于能够容忍它的最小范围内。这样一来,其他任何操作都不会弄乱它,而且它不会保留以前操作中不应该保留的值。毕竟,这是他们的重点

当您将它们声明为文件作用域,然后不在使用它们的作用域中声明它们时,可能会有两个同名的不相关的用法相互冲突。词法变量的主要好处之一是,您不必知道范围或程序中任何其他变量的名称:

my( $foo, ... );

while( ... ) {
   $foo = ...;
   do_something();
   ...
   }

sub do_something {
   $foo = ...;
   }
while
sub
中对
$foo
的使用是相同的,还是它们意外地有相同的用法
my( $foo, ... );

while( ... ) {
   $foo = ...;
   do_something();
   ...
   }

sub do_something {
   $foo = ...;
   }
while( ... ) {
   my $foo = ...;
   do_something($foo);
   ...
   }

sub do_something {
   my( $foo ) = @_;
   }   
# in Local/Config.pm
package Local::Config;
use Exporter qw(import);
our @EXPORT = qw( $foo $bar );        
our $foo = 'Some value';
our $bar = 'Different value';
1;
# in some program
use Local::Config;