【问题标题】:Perl script does not recognize paths which contains environment variablesPerl 脚本无法识别包含环境变量的路径
【发布时间】:2018-11-03 01:28:11
【问题描述】:

我得到了一个文件,每行都有一个路径。我将这些行插入到数组@dirs 中。一些路径包括环境变量。带路径的有效文件示例:

/some/valid/path
$HOME/dir
$SOME_ENV/dir

每个路径,我想检查它是否包含一个名为abc 的文件。所以我使用:

foreach my $dir (@dirs) {
   chmod($dir);
   my $file = $dir."/"."abc";
   print "invalid dir: $dir" unless((-e $file) && (-s $file));
}

但是,由于某种原因,它无法识别环境变量,这意味着即使 $SOME_ENV/dir 包含 abc 文件,它也会失败。

此外,如果我按以下方式使用,脚本确实可以识别这些环境变量:

print $ENV{SOME_ENV}."\n";
print $ENV{HOME}."\n";

此外,我尝试使用Cwd模块的abs_path,以获取路径的真实路径(因此它不会包含环境变量),但它也无法识别环境变量。

为什么(-e $file) 无法识别环境变量?我该如何解决这个问题?

【问题讨论】:

  • 确切的错误信息是什么?
  • 如果他们没有提前知道:no strict 'vars';use Env;
  • 打电话给chmod 是为了什么?第一个参数应该是新的权限
  • 感谢 cmets。我不知道路径。用户提供一个文件,我从中提取路径到一个数组中。即使这个目录路径包含abc,检查(-e $file) 将返回false,因为它只是(出于某种原因)复制字符串而不使用env。
  • 您是不是要使用chomp (perldoc) 而不是chmod

标签: perl environment-variables


【解决方案1】:

您的代码中没有针对其中的环境变量评估 $dir 的任何内容,因此您需要添加它。一个非常简单的方法可以像这样完成 - 使用正则表达式来查找变量,然后用它们在 %ENV 哈希中的值替换它们。

$dir =~ s/\$([A-Z0-9_]*)/$ENV{$1}/g;

【讨论】:

  • 感谢您的回答。此正则表达式不适用于$SOME_ENV(仅适用于带有A-Z 字母的字符串)。另外,如果 env 位于字符串的中间/末尾,它会起作用吗?
  • 您可以简单地在字符类中添加 _,使其变为 [A-Z_]。正则表达式没有锚定,因此它可以在字符串中的任何位置工作。
  • @Grinnz 当然可以,但是如果用户有数字或任何其他符号不在[A-Z] 范围内怎么办?
  • 另外 /e 修饰符也不是必须的,因为 $ENV{$1} 会自行插入。
  • 查看相关的stackoverflow.com/questions/2821043/…,如果您好奇为什么 [A-Z0-9_] 应该足以作为字符类而不是更宽松的否定字符类。
猜你喜欢
  • 1970-01-01
  • 2020-04-19
  • 1970-01-01
  • 2019-12-18
  • 2016-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多