Perl脚本无法识别包含环境变量的路径

Perl脚本无法识别包含环境变量的路径,perl,environment-variables,Perl,Environment Variables,我得到了一个每行都有路径的文件。我将这些行插入数组@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) &

我得到了一个每行都有路径的文件。我将这些行插入数组
@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\u path
,以获得路径的真实路径(因此它不包括环境变量),但它也无法识别环境变量


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

代码中没有任何内容用于计算
$dir
中的环境变量,因此您需要添加它。一种非常简单的方法可以这样做-使用正则表达式查找变量,然后在
%ENV
哈希中用它们的值替换它们

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

您的代码中没有为其中的环境变量计算
$dir
,因此您需要添加它。一种非常简单的方法可以这样做-使用正则表达式查找变量,然后在
%ENV
哈希中用它们的值替换它们

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


确切的错误信息是什么?如果他们事先不知道:
没有严格的“vars”;使用Env
对chmod的调用是为了什么?第一个参数应该是注释的new PermissionsHanks。我不知道路。用户提供了一个文件,我将其路径提取到一个数组中。即使指向dir的路径包含
abc
,检查
(-e$file)
也会返回false,因为它只是(出于某种原因)复制字符串而不使用env。您是想使用
chomp
()而不是
chmod
?确切的错误消息是什么?如果他们事先不知道:
没有严格的“vars”;使用Env
对chmod的调用是为了什么?第一个参数应该是注释的new PermissionsHanks。我不知道路。用户提供了一个文件,我将其路径提取到一个数组中。即使指向dir的路径包含
abc
,检查
(-e$file)
也会返回false,因为它只是(出于某种原因)复制字符串而不使用env。您是想使用
chomp
()而不是
chmod
?谢谢您的回答。此正则表达式不适用于
$SOME_ENV
(仅适用于带有
a-Z
字母的字符串)。另外,如果env位于字符串的中间/末端,它会起作用吗?您只需在character类中添加u.,它就会变成
[A-Z_u]
。正则表达式没有锚定,所以它可以在字符串中的任何位置工作。@grinz当然可以,但是如果用户有数字或任何其他不在
[A-Z]
范围内的符号怎么办?而且/e修饰符也不是必需的,因为
$ENV{$1}
将自己进行很好的插值。如果您想知道为什么[A-Z0-9},请参阅相关内容作为一个字符类和更多允许的否定字符类应该足够了。谢谢你的回答。此正则表达式不适用于
$SOME_ENV
(仅适用于带有
a-Z
字母的字符串)。另外,如果env位于字符串的中间/末端,它会起作用吗?您只需在character类中添加u.,它就会变成
[A-Z_u]
。正则表达式没有锚定,所以它可以在字符串中的任何位置工作。@grinz当然可以,但是如果用户有数字或任何其他不在
[A-Z]
范围内的符号怎么办?而且/e修饰符也不是必需的,因为
$ENV{$1}
将自己进行很好的插值。如果您想知道为什么[A-Z0-9},请参阅相关内容作为一个字符类,与更允许的否定字符类相比,应该足够了。