我将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;
}
答案 0 :(得分:6)
在Perl类型SCALAR
中,ARRAY
和HASH
由变量名称中的前导符号$
,@
和{{区分分别为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
)变量的范围限制在最近的封闭块
声明也可以在循环内完成,允许my
和while (my $var = EXPR) {}
foreach my $var (LIST) {}
作用于循环块
$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语言。