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

时间:2017-09-20 05:13:42

标签: 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;
}

2 个答案:

答案 0 :(得分:6)

在Perl类型SCALAR中,ARRAYHASH由变量名称中的前导符号$@和{{区分分别为1}},但除此之外,它们可能具有相同的名称。因此%$var以及@var不属于同一%var" typeglob,"完全不同的变量。

哈希的键必须是标量,我们称之为*var。然后,哈希$key中的对应值为%h,前导$h{$key}表示此现在是标量。很像数组的元素是标量,因此$

$ary[$index]中,标量foreach $var (@ary)并非真正"获取值"数组元素,而是别名。因此,如果您在循环中更改它,则更改数组的元素。

(注意,你有数组$var,而不是@opts。)

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

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

  • 声明也可以在循环内完成,允许mywhile (my $var = EXPR) {} foreach my $var (LIST) {}作用于循环块

    < / LI>
  • $var完全是一个不同的野兽,在此代码中应该local而不是

  • my等循环标签通常以大写字母输入

  • 函数名前面的arg:具有特殊含义,很少需要。这段代码几乎肯定不需要

  • 引入变量(在现代代码中用&声明)时,像my @optArgs = ()这样的空列表的分配是不需要的,并且没有效果

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

除了最后两个与你的Python翻译任务无关,对于这个脚本。

答案 1 :(得分:-2)

首先,为了清楚说明,在perl中,就像在shell中一样,你可以用大括号{}包围变量名: ${bimbo}$bimbo是相同的标量变量。

@bimbo是一个数组指针; %bimbo是一个哈希指针; $bimbo是标量(唯一值)。

要解决数组或哈希值,您必须使用'$': $bimbo{'index'}是哈希%bimbo的'索引'值。 如果$ i包含一个int,例如1, $bimbo[$i]是数组@bimbo的第二个值。

因此,正如您所看到的,@或%ALWAYS引用整个数组,因为$bimbo{}$bimbo[]指的是散列或数组的任何值。

${bimbo[4]}指的是数组@bimbo的第5个值; %{bimbo{'index'}}是指数组%bimbo的'index'值。

是的,所有这些结构可以具有相同的名称。这是perl的明显语法之一。

而且,euhm ...总是认为perl是一种C ++编写的语法,它是简化的,但它是C语言。