【问题标题】:Elegant way to set an environment variable in Perl在 Perl 中设置环境变量的优雅方法
【发布时间】:2021-04-19 14:25:27
【问题描述】:

在我的 Perl 脚本中,我试图设置一个环境变量(例如 PATH)。如果它已经定义,请添加它的路径。否则,设置环境。代码:

if (defined($ENV{"PATH"})) {
    $ENV{"PATH"} = $ENV{"PATH"}.":/usr/pkgs/";
} else {
    $ENV{"PATH"} = "/usr/pkgs/";
}

在 Perl 中有没有更好更优雅的方法来做到这一点?也许一个班轮?请注意,环境不必是PATH

【问题讨论】:

  • 您是在 Perl 内部还是在 Perl 外部的 shell 中设置环境变量?
  • 可能是$ENV{PATH} = join(':', grep { defined $_ } ($ENV{PATH}, '/usr/pkgs/'));
  • @TLP 在 perl 脚本中(环境可能已经在运行脚本的 shell 中定义)。
  • defined 处理未设置的 PATH,但不是空路径。您想用length 替换defined 来处理这两个问题。
  • @ikegami 或者只使用$_ 本身。

标签: perl environment-variables


【解决方案1】:

如果你使用Env核心模块:

use warnings;
use strict;
use Env qw(@PATH);

push @PATH, '/usr/pkgs/';

【讨论】:

    【解决方案2】:

    我可能会写这样的东西,我使用长度来确定要添加的内容(尽管我不希望“0”成为$ENV{PATH} 的值)。 Config 模块知道路径分隔符应该是什么:

    use Config qw(%Config);
    
    $ENV{PATH} .= ( length $ENV{PATH} ? $Config{path_sep} : '' ) . "/usr/pkgs/";
    

    【讨论】:

      【解决方案3】:

      基于Mathias'answer,它基本上使用split作为hack,为$ENV{PATH}中的空值创建一个空列表。您可以使用更简单的检查|| 检查变量中的值是否为假,这在 Perl 标量中意味着基本上是空字符串、未定义或零。由于我们希望避免在字符串开头添加冒号,因此我们希望将其替换为空列表()。于是就变成了:

      $ENV{PATH} = join ":", $ENV{PATH} || (), "/usr/pkgs/";
      

      从技术上讲,0 可能是有效路径,但感觉不太可能是正确路径。

      【讨论】:

        【解决方案4】:

        我会像这样使用splitjoin

        $ENV{PATH} = join(":", split(/:/, $ENV{PATH}), "/usr/pkgs")
        

        【讨论】:

        • PATH= /usr/bin/perl -e 'print join(":",$ENV{PATH},"/abc"),"\n"' 打印 :/abc
        • @TLP,在这种特殊情况下可能不是,但通常需要处理最初为空/未设置的 var。这个解决方案也是我会使用的(虽然 bdf 的解决方案更有效)。
        • FWIW,如果我的和这个之间有任何明显的性能差距,我会感到惊讶。你必须有一个巨大的 PATH 和一个非常非常快的程序才能成为一个问题。 :)
        • 好的,我明白了,split 被用作过滤空字符串的黑客手段。你可以只做$ENV{PATH} || (),它甚至不会对未初始化的值发出警告,但仍然会过滤掉空值或假值。
        • @ikegami split /:/, "" 返回 () 而不是 "",这难道不是一个错误吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-19
        • 2017-05-23
        • 1970-01-01
        • 2023-03-03
        • 2018-03-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多