【问题标题】:Does "print $ARGV" alter the argument array in any way?“print $ARGV”会以任何方式改变参数数组吗?
【发布时间】:2023-03-29 13:44:01
【问题描述】:

示例如下:

$a = shift; 
$b = shift; 
push(@ARGV,$b); 
$c = <>; 

print "\$b: $b\n"; 
print "\$c: $c\n"; 
print "\$ARGV: $ARGV\n"; 
print "\@ARGV: @ARGV\n"; 

然后输出:

$b: file1 
$c: dir3 

$ARGV: file2 
@ARGV: file3 file1 

我不明白在没有任何索引的情况下打印 $ARGV 时到底发生了什么。它是否打印第一个参数,然后将其从数组中删除?因为我认为在所有语句之后数组变为:

file2 file3 file1

调用:

perl port.pl -axt file1 file2 file3 

file1 包含以下行:

dir1 
dir2 

文件2:

dir3 
dir4 
dir5 

文件3:

dir6 
dir7

【问题讨论】:

    标签: perl command-line-arguments argv shift


    【解决方案1】:

    Greg 引用了相应的文档,所以这里是发生的事情的简要说明

    $a = shift;                 # "-axt" is removed from @ARGV and assigned to $a
    $b = shift;                 # "file1" likewise
    push(@ARGV,$b);             # "file1" inserted at end of @ARGV
    $c = <>;                    # "file2" is removed from @ARGV, and its file
                                # handle opened, the first line of file2 is read
    

    当打开“file2”的文件句柄时,它会将文件名设置为$ARGV。正如 Greg 所说,@ARGV$ARGV 是完全不同的变量。

    菱形运算符&lt;&gt; 的内部运作可能是让您感到困惑的地方,因为它与$ARGV = shift @ARGV 的作用很相似

    【讨论】:

    • 哦,我明白了,是的,我仍然想知道如何从数组中删除参数。谢谢!
    【解决方案2】:

    在 Perl 中,$ARGV@ARGV 完全不同。来自perlvar

    $ARGV

    &lt;&gt;读取时包含当前文件的名称。

    @ARGV

    数组@ARGV 包含用于脚本的命令行参数。 $#ARGV 一般是参数个数减一,因为$ARGV[0] 是第一个参数,而不是程序的命令名本身。命令名称见$0

    【讨论】:

      【解决方案3】:

      不,但&lt;&gt; 可以。 &lt;&gt;&lt;ARGV&gt; 的缩写(又是 readline(ARGV) 的缩写) , 其中ARGV 是一个特殊的文件句柄,它从@ARGV 中列出的文件中读取(或者STDIN,如果@ARGV 为空)。当它打开@ARGV 中的文件时,它会从@ARGV 中删除它们并将它们存储在$ARGV 中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-29
        • 1970-01-01
        • 1970-01-01
        • 2012-04-30
        相关资源
        最近更新 更多