我正在将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)
在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翻译任务无关,对于此脚本.