是否可以在Perl中使用具有相同名称的散列,数组,标量?

Kim*_*Kim 1 perl

我正在将perl脚本转换为python.
我之前没有使用perl语言,perl中的很多东西让我很困惑.
例如,在下面,opt首先被声明为标量,但再次声明为哈希.%opt = ();
是否可以在perl中声明标量和具有相同名称的哈希?

据我所知,这foreach $opt (@opts)意味着标量opt逐个获取数组opts的值.
opt此时是一个数组???
另外,什么$opt{$opt}意思?
$ opt {$ opt} 之外选择是一个哈希,并且选择*opt { $ opt }是一个标量?
我很困惑,请帮帮我...

sub ParseOptions
{
    local (@optval) = @_;
    local ($opt, @opts, %valFollows, @newargs);

    while (@optval) {
        $opt = shift(@optval);
        push(@opts,$opt);
        $valFollows{$opt} = shift(@optval);
    }

    @optArgs = ();
    %opt = ();

    arg: while (defined($arg = shift(@ARGV))) {
        foreach $opt (@opts) {
            if ($arg eq $opt) {
                push(@optArgs, $arg);
                if ($valFollows{$opt}) {
                    if (@ARGV == 0) {
                        &Usage();
                    }
                    $opt{$opt} = shift(@ARGV);
                    push(@optArgs, $opt{$opt});
                } else {
                    $opt{$opt} = 1;
                }
                next arg;
            }
        }
        push(@newargs,$arg);
    }

    @ARGV = @newargs;
}
Run Code Online (Sandbox Code Playgroud)

zdi*_*dim 7

在Perl类型SCALAR,ARRAY以及HASH由领先的印记在变量名,区分$,@%分别,但在其他方面,他们可以承担相同的名称.因此,$var@var%var的,不是属于同其他*var"类型团"完全不同的变量.

哈希的键必须是标量,我们称之为标量$key.然后它在散列中的相应值%h$h{$key},前导$表示这现在是标量.就像数组的元素是标量一样$ary[$index].

foreach $var (@ary)标量$var中并不真正"获取"数组元素的值,而是将它们别名化.因此,如果在循环中更改它,则更改数组的元素.

(注意,你有阵列@opts,不是@opt.)


根据现代Perl中的常见做法,对代码进行了一些评论

  • 一个人应该始终use warnings;站在最前面.另一个有use strict;,因为它强制使用my(或our)声明变量,促进各种良好的行为.这会将lexical(my)变量的范围限制为最近的封闭块

  • 声明也可以在循环内完成,允许while (my $var = EXPR) {}foreach my $var (LIST) {}在哪里$var限定循环的块

  • local是一个不同的野兽一起,并在此代码应该有my代替

  • 循环标签arg:通常以块大写形式输入

  • &前面的函数名的有特殊的意义,很少需要.这段代码几乎肯定不需要

  • my @optArgs = ()引入变量时的空列表的赋值(my在现代代码中声明)是不必要的,并且没有效果

  • 在这段代码中,不需要首先引入变量,因为它们是全局变量,因此在第一次使用时就会被创建,就像在Python中一样 - 除非它们在这个子集之外使用,在这种情况下它们可能需要被清除.这就是全局变量,它们遍布所有代码

除了最后两个,这些与您的Python翻译任务无关,对于此脚本.