首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用perl @ARGV

使用perl @ARGV
EN

Stack Overflow用户
提问于 2019-02-24 05:10:25
回答 3查看 474关注 0票数 1

在perl应用程序中,我使用@ARGV传递变量。当总是有两个变量,并且总是相同的两个变量时,没有问题。现在它变得更复杂了,所以我需要在添加之前“清空”@ARGV。所以我想这是可行的:

代码语言:javascript
复制
    foreach (@ARGV)
            {
                pop @ARGV;
            }

当有四个元素时,它只删除两个元素。你知道为什么会这样吗?或任何其他清空它的方法?

EN

回答 3

Stack Overflow用户

发布于 2019-02-24 05:13:08

在perl应用程序中,我使用@ARGV传递变量。

这是一个糟糕的设计,应该避免。如果您需要传递值,请使用函数参数,或者至少使用您自己的全局变量。不要(Ab)使用一个特殊的变量。

现在它变得更复杂了,所以我需要在添加之前“清空”@ARGV。

如果要使数组为空,请为其分配一个空列表:

代码语言:javascript
复制
@ARGV = ();
票数 5
EN

Stack Overflow用户

发布于 2019-02-24 06:05:38

您的错误:您正在使用foreach (提取列表元素)和修改(pop) 相同的数组!引用perlsyn

如果列表的任何部分是一个数组,如果您在循环体中添加或删除元素,例如使用spliceforeach将会非常混乱。所以不要那样做。

下面说明了代码中发生的情况:

代码语言:javascript
复制
#!/usr/bin/perl
use warnings;
use strict;

print "ARGV BEFORE: ", scalar(@ARGV), "\n";

my $count = 0;
foreach my $loop (@ARGV) {
    ++$count;
    print "ARGV beginning loop ${count} for ${loop}: ", scalar(@ARGV), "\n";
    pop @ARGV;
    print "ARGV end loop ${count} for ${loop}: ", scalar(@ARGV), "\n";
}

print "ARGV AFTER: ", scalar(@ARGV), "\n";

exit 0;

测试运行:

代码语言:javascript
复制
$ perl dummy.pl 1 2 3 4
ARGV BEFORE: 4
ARGV beginning loop 1 for 1: 4
ARGV end loop 1 for 1: 3
ARGV beginning loop 2 for 2: 3
ARGV end loop 2 for 2: 2
ARGV AFTER: 2

将其与在每次迭代中重新检查列表的正确方法进行比较:

代码语言:javascript
复制
while (@ARGV) {
    ++$count;
    print "ARGV beginning loop ${count}: ", scalar(@ARGV), "\n";
    pop @ARGV;
    print "ARGV end loop ${count}: ", scalar(@ARGV), "\n";
}
代码语言:javascript
复制
$ perl dummy.pl 1 2 3 4
ARGV BEFORE: 4
ARGV beginning loop 1: 4
ARGV end loop 1: 3
ARGV beginning loop 2: 3
ARGV end loop 2: 2
ARGV beginning loop 3: 2
ARGV end loop 3: 1
ARGV beginning loop 4: 1
ARGV end loop 4: 0
ARGV AFTER: 0

也就是说:,请帮你自己一个忙,重新考虑你的软件架构/设计。为了自己的目的而误用带有已定义语义的Perl变量是一个非常糟糕的想法。

票数 5
EN

Stack Overflow用户

发布于 2019-02-24 05:22:33

你读过the documentation for pop()吗?上面写着:

弹出并返回数组的最后一个值,将数组缩短一个元素。

所以我不清楚为什么你认为它会清空数组。Perl有一套很棒的文档,但如果您不读它,它就毫无用处了:-)

可以通过为数组分配一个空列表来清除该数组,如下所示:

代码语言:javascript
复制
@ARGV = ();

但我不得不说,使用@ARGV做这件事听起来是个糟糕的主意。@ARGV有一个明确的用途-它包含传递给程序的命令行参数。真的没有必要把它用在别的地方。如果您想要自己的数组,那么只需创建一个新的数组。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54846243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档