代码之家  ›  专栏  ›  技术社区  ›  Rob Wells

在使用其他人的PerlAPI时,避免使用$\uu是一种惯例吗?

  •  9
  • Rob Wells  · 技术社区  · 14 年前

    在将其他人的API与默认变量结合使用时,我刚刚被发现了。$_

    foreach (@rps_server_details) {
        @server_data = ();
        @server_data = split(/,/);
        @$esp_hosts = ();
        $filters{server_name} = $server_data[0];
        print "--->$_<--\n";
        $esp_hosts = $esp->get_hosts(fields => $fields, %filters) || die "$@";
        print "--->$_<--\n";
    

    其输出为:

    --->igrid8873.someone.com,app_10<--
    Use of uninitialized value in concatenation (.) or string at ./rps_inv_lookup.pl line 120.
    ---><--
    

    指定我自己的循环变量而不是依赖于$u来解决问题。

    我只是幼稚地把$和别人写的API结合在一起吗?或者这是那个API模块中的一个bug?

    3 回复  |  直到 14 年前
        1
  •  9
  •   cjm    14 年前

    $_

    local($_);
    

    local

    my $_;
    

    美元 是一个全局变量,在某些情况下可能导致 不必要的副作用。从Perl5.9.1开始,现在可以使用 词法版本 美元 通过在文件或块中声明 用“我的”。此外,声明 our $_ “恢复全局 美元 在当前范围内。

        2
  •  6
  •   DVK    14 年前

    我想说是:

    1. $_

    2. local $_ perldoc perlvar

        3
  •  2
  •   Eric Strom    14 年前
    foreach (@rps_server_details) {
        @server_data = ();
        @server_data = split(/,/);
        @$esp_hosts = ();
        $filters{server_name} = $server_data[0];
        print "--->$_<--\n";
        {
            local *_;  # disconnects the remaining scope from the implicit 
                       # variables so you can clean up after the dirty api.
                       # NOTE: Submit a bug report against the offending module.
                       #       If you notice this across multiple api features
                       #       consider finding a different module for this task.
            $esp_hosts = $esp->get_hosts(fields => $fields, %filters) || die "$@";
        }
        print "--->$_<--\n";