Perl 全局定义数组

Perl 全局定义数组,perl,Perl,全局定义一个数组,用一个子例程填充它,然后在脚本的另一部分中访问它,这是一种不好的做法吗?例如: use strict; use warnings; my @people = qw( Ted Bill Tom); my @names; &main; sub main{ foreach(@people){ &fillNames; } } sub fillNames { undef @names; print "$_\n";

全局定义一个数组,用一个子例程填充它,然后在脚本的另一部分中访问它,这是一种不好的做法吗?例如:

use strict;
use warnings;

my @people = qw( Ted Bill Tom);
my @names;

&main;

sub main{
    foreach(@people){
        &fillNames;
    }
}

sub fillNames {

    undef @names;
    print "$_\n";
    push(@names,$_);


    }
在上面的例子中,我可以让子例程返回数组,但在我的程序中,我使用多个数组(据我所知,一个子例程不能返回多个数组)


我看到的另一种方法是创建一个文件,让子例程为文件的每个索引打印数组的内容,然后让主子例程访问该文件。这是一种更好的方法吗?

这里没有现成的答案,但我认为这取决于脚本的大小和范围


如果您的脚本足够小,很容易跟踪全局变量,那么我会说这没有问题。然而,一旦你达到了一定的规模和复杂程度,我会小心以这种方式使用全局数组。

这里没有简单的答案,但我认为这取决于脚本的大小和范围


如果您的脚本足够小,很容易跟踪全局变量,那么我会说这没有问题。然而,一旦你达到了一定的规模和复杂程度,我会小心以这种方式使用全局数组。

这里没有简单的答案,但我认为这取决于脚本的大小和范围


如果您的脚本足够小,很容易跟踪全局变量,那么我会说这没有问题。然而,一旦你达到了一定的规模和复杂程度,我会小心以这种方式使用全局数组。

这里没有简单的答案,但我认为这取决于脚本的大小和范围


如果您的脚本足够小,很容易跟踪全局变量,那么我会说这没有问题。但是,一旦超过一定的大小和复杂程度,我会小心以这种方式使用全局数组。

通常避免使用全局数组的原因是,您很容易受到“污染”——被更多源修改的变量越多,就很难跟踪断开的代码

作为一个简短的剧本,你一般都很好

我真的会避免使用像
&fillnames不过。这是在做一些你可能并不完全期待的事情。以这种方式调用sub“传递”隐式变量,这不是一种好的样式(在我看来)

相反:

foreach my $person ( @people ) {
   fillNames ( $person ); 
 }
子例程不能返回多个数组,你是对的。嗯,有点-它返回一个平面列表,并连接元素。如果要返回多个数组,则需要通过引用执行

例如:


但需要注意的是,您的代码取消了@names的定义,然后将一个值推入其中。这可能不是您想要做的事情,而这正是使用“globals”可能导致的问题。因为事实上,你只能在@names中使用最后一个“name”

通常避免使用全局变量的原因是,您很容易受到“污染”——被更多源修改的变量越多,就很难跟踪一段中断的代码

作为一个简短的剧本,你一般都很好

我真的会避免使用像
&fillnames不过。这是在做一些你可能并不完全期待的事情。以这种方式调用sub“传递”隐式变量,这不是一种好的样式(在我看来)

相反:

foreach my $person ( @people ) {
   fillNames ( $person ); 
 }
子例程不能返回多个数组,你是对的。嗯,有点-它返回一个平面列表,并连接元素。如果要返回多个数组,则需要通过引用执行

例如:


但需要注意的是,您的代码取消了@names的定义,然后将一个值推入其中。这可能不是您想要做的事情,而这正是使用“globals”可能导致的问题。因为事实上,你只能在@names中使用最后一个“name”

通常避免使用全局变量的原因是,您很容易受到“污染”——被更多源修改的变量越多,就很难跟踪一段中断的代码

作为一个简短的剧本,你一般都很好

我真的会避免使用像
&fillnames不过。这是在做一些你可能并不完全期待的事情。以这种方式调用sub“传递”隐式变量,这不是一种好的样式(在我看来)

相反:

foreach my $person ( @people ) {
   fillNames ( $person ); 
 }
子例程不能返回多个数组,你是对的。嗯,有点-它返回一个平面列表,并连接元素。如果要返回多个数组,则需要通过引用执行

例如:


但需要注意的是,您的代码取消了@names的定义,然后将一个值推入其中。这可能不是您想要做的事情,而这正是使用“globals”可能导致的问题。因为事实上,你只能在@names中使用最后一个“name”

通常避免使用全局变量的原因是,您很容易受到“污染”——被更多源修改的变量越多,就很难跟踪一段中断的代码

作为一个简短的剧本,你一般都很好

我真的会避免使用像
&fillnames不过。这是在做一些你可能并不完全期待的事情。以这种方式调用sub“传递”隐式变量,这不是一种好的样式(在我看来)

相反:

foreach my $person ( @people ) {
   fillNames ( $person ); 
 }
子例程不能返回多个数组,你是对的。嗯,有点-它返回一个平面列表,并连接元素。如果要返回多个数组,则需要通过引用执行

例如:


但需要注意的是,您的代码取消了@names的定义,然后将一个值推入其中。这可能不是您想要做的事情,而这正是使用“globals”可能导致的问题。因为事实上,你只能在@names中使用最后一个“name”

在使用全局数组之前,我会返回数组引用列表。如果要清空数组