Perl变量和子例程

时间:2015-07-07 06:06:08

标签: perl variables webmin

我是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();
}

这里发生了什么?值存储的地方?请有人详细解释这段代码。

1 个答案:

答案 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的方式与许多其他函数默认为@_的方式非常相似。我倾向于更喜欢前者。

但是通过命名您的参数,您可以清楚地了解它们是什么,以及它们正在做什么。