2在Perl中作为参数的子引用

时间:2014-01-14 17:24:03

标签: perl

我有perl功能我不知道它做什么? 我的perl是什么? @ARVG是什么意思?

sub getArgs
{
my $argCnt=0;
my %argH;

for my $arg (@ARGV)
{
    if ($arg =~ /^-/)   # insert this entry and the next in the hash table
    {
        $argH{$ARGV[$argCnt]} = $ARGV[$argCnt+1];
    }
    $argCnt++;
}
return %argH;}

2 个答案:

答案 0 :(得分:2)

这样的代码让大卫伤心......

这是正确执行缩进的代码的重新格式化版本。这使它更容易阅读。我可以很容易地告诉我if和循环的开始和结束位置:

sub getArgs {
    my $argCnt = 0;
    my %argH;

    for my $arg ( @ARGV ) {
        if ( $arg =~ /^-/ )  { # insert this entry and the next in the hash table
            $argH{ $ARGV[$argCnt] } = $ARGV[$argCnt+1];
        }
        $argCnt++;
    }
    return %argH;
}

@ARGV是传递给程序的内容。它是传递的所有参数的数组。例如,我有一个程序foo.pl,我称之为:

foo.pl one two three four five

在这种情况下,$ARGV设置为值("one", "two", "three", "four", "five")列表。该名称来自C编程语言中的类似变量。

作者试图解析这些论点。例如:

foo.pl -this that -the other

会导致:

$arg{"-this"} = "that";
$arg{"-the"}  = "other";

我没有看到min。你的意思是my

这是一个复杂的讨论,通常涉及包变量与词汇范围变量,以及Perl如何存储变量。为了使事情变得更容易,我将给你一个不正确的,但在技术上错误的答案:如果你使用(严格)编译指示,你应该,你必须在my之前声明你的变量可以使用。例如,这是一个简单的双线程序,这是错误的。你能看到错误吗?

$name = "Bob";
print "Hello $Name, how are you?\n";

请注意,当我将$name设置为“Bob”时,$name使用小写n。但是,我在$Name语句中使用了print(大写 N )。现在看来,现在。 Perl将打印出“你好,你好吗?”我没注意到我使用了错误的变量名。如果在双线程序中很难发现这样的错误,想象一下在1000行程序中它会是什么样子。

通过使用 strict 并强制我使用my声明变量,Perl可以捕获该错误:

use strict;
use warnings;  # Another Pragma that should always be used

my $name = "Bob";
print "Hello $Name, how are you doing\n";

现在,当我运行程序时,出现以下错误:

  

全局符号“$ Name”需要显式包名称(print语句的行号

这意味着未定义$Name,Perl指向该错误的位置。

当你定义这样的变量时,它们是在范围中,在中定义它。块可以是包含在一组花括号中的代码,也可以是whileiffor语句。如果您在这些变量之外定义my的变量,则将其定义到文件的末尾。

因此,通过使用my,变量仅在此子例程中定义。并且,$arg变量仅在for循环中定义。


还有一件事:

写这篇文章的人应该使用Getopt::Long模块。他们的代码中存在一个主要错误:

例如:

foo.pl -this that -one -two

在这种情况下,我的哈希看起来像这样:

$args{'-this'} = "that";
$args{'-one'}  = "-two";
$args{'-two'}  = undef;

如果我这样做了:

if ( defined $args{'-two'} ) {
    ...
}

我不会执行if声明。

此外:

foo.pl -this=that -one -two

也会失败。

答案 1 :(得分:1)

@ARGV是一个特殊变量(请参阅perldoc perlvar):

  

@ARGV

     

数组@ARGV包含用于的命令行参数   脚本。 $#ARGV通常是参数的数量减去1,因为   $ ARGV [0]是第一个参数,而不是程序的命令名本身。   请参阅$ 0获取命令名称。

Perl文档也可以从命令行获得:

perldoc -v @ARGV