我是perl编程语言的新手。我想了解webmin
模块。我没有收到此代码段:
sub update_dialer
{
local $lref = &read_file_lines($config{'file'});
splice(@$lref, $_[0]->{'line'}, $_[0]->{'eline'} - $_[0]->{'line'} + 1,
&dialer_lines($_[0]));
&flush_file_lines();
}
这里发生了什么?值存储的地方?请有人详细解释这段代码。
答案 0 :(得分:0)
简短摘要:“讨厌的perl代码”。
答案越久:
sub update_dialer {
# take a global variable $lref.
# scope it locally it can be modified within the local subroutine
# run the sub "read_file_lines" and pass it the contents of `$config{'file'}
# assign the result to $lref
local $lref = &read_file_lines( $config{'file'} );
#removes elements from an array.
#Number based on a hash reference passed in as the first argument in @_
#but is also calling the dialer_lines subroutine as part of it.
splice(
@$lref, $_[0]->{'line'},
$_[0]->{'eline'} - $_[0]->{'line'} + 1,
&dialer_lines( $_[0] )
);
#run the sub 'flush_file_lines'.
&flush_file_lines();
}
它正在实施一系列不良做法:
local
该联机帮助页指出了这个问题:
你真的可能想要使用我的,因为本地并不是大多数人认为的“本地”。 See Private Variables via my() in perlsub for details.
local
作为暂时覆盖全局变量的方式而存在。它很有用 - 例如 - 如果要更改输入记录分隔符$/
。
你可以这样做:
{
local $/ = "\n\n";
my $first_record = <$filehandle>;
print $first_record;
}
这意味着一旦退出代码块,$/
将返回其原始值,并且不会搞砸代码中文件IO的所有其余部分。在这个例子中没有充分的理由像这样使用它。
&
前缀Difference between &function and function() in perl
使用&
前缀一个sub做了一些你几乎从未真正想要的东西,因为它混淆了原型和诸如此类的东西。因此,你不应该这样做。
splice
删除并替换数组中的元素。不是特别错误但事实上它正是这样做的,这使得很难说它正在做什么。
(但我认为因为它正在本地化$lref
,它的值会在此子句的末尾消失。
$_[0] -> {'line'}
调用sub时,它会传递一个带有函数参数的数组@_
。您可以使用$_[0]
来访问此数组的第一个元素 - 但 NOT 与$_
相同,原因是$list[0]
和{{1}不一样。
使用它的方式 - $list
告诉我们这是一个哈希引用,并且它被取消引用以访问某些变量。
但这并不能完全创造出漂亮可读的代码。
您可以改为:
$_[0] -> {'line'}
或者也许:
my ( $parameter_ref ) = @_;
这里的品味问题 - 默认情况下,my $parameter_ref = shift;
使用shift
的方式与许多其他函数默认为@_
的方式非常相似。我倾向于更喜欢前者。
但是通过命名您的参数,您可以清楚地了解它们是什么,以及它们正在做什么。