Linux 为什么我的Perl脚本在“~/”上失败,而在“$ENV{HOME}”上工作?

Linux 为什么我的Perl脚本在“~/”上失败,而在“$ENV{HOME}”上工作?,linux,perl,unix,Linux,Perl,Unix,我一直在使用我的这个脚本,我一直在使用~/来扩展我的主目录。我今天开始工作,但它停止了工作: #if ( $output eq "" ) { $output = "~/tmp/find_$strings[0].rslt" } # BROKEN if ( $output eq "" ) { $output = "$ENV{HOME}/tmp/find_$strings[0].rslt" } #WORKS ... open OUT_FILE, ">$output" or di

我一直在使用我的这个脚本,我一直在使用~/来扩展我的主目录。我今天开始工作,但它停止了工作:

#if ( $output   eq "" ) { $output   = "~/tmp/find_$strings[0].rslt" } # BROKEN
if ( $output   eq "" ) { $output   = "$ENV{HOME}/tmp/find_$strings[0].rslt" } #WORKS
 ...
open OUT_FILE, ">$output" or die "cant open $output : $!";
你知道为什么这会突然停止工作吗

错误看起来像:

cant open stephen/tmp/find_coverp.rslt : No such file or directory at /user/stephen/bin/find.pl line 137.

~由外壳扩展。Perl对此一无所知。因此,它只能在shell脚本中工作。

~由shell扩展。Perl对此一无所知。因此,它只能在shell脚本中工作。

tilde扩展不是由perl完成的,而是由shell完成的

您应改为使用:

 use File::Spec::Functions qw( catfile );
 ...
 my $fn = catfile $ENV{HOME}, 'tmp', "find_$strings[0].rslt";
 ...
 open my $out, '>', $fn or die "Cannot open '$fn': $!";

tilde扩展不是由perl完成的,而是由shell完成的

您应改为使用:

 use File::Spec::Functions qw( catfile );
 ...
 my $fn = catfile $ENV{HOME}, 'tmp', "find_$strings[0].rslt";
 ...
 open my $out, '>', $fn or die "Cannot open '$fn': $!";

正如前面的回答所述,~tilde是由shell扩展的,而不是由perl扩展的。 最有可能的原因是,当前目录中存在一个目录~而该目录最终被删除,导致出现错误:

举例说明:

Tilde不在Perl中工作,使用$ENV{HOME}工作:

$ echo MM > MM $ perl5.8 -e '{print `cat ~/MM`}' cat: cannot open ~/MM $ perl5.8 -e '{print `cat $ENV{HOME}/MM`}' MM 使波浪形命名目录生效:

$ mkdir \~ $ echo MM > \~/MM $ ls -l \~ -rw-rw-r-- 1 DVK users 3 Jun 10 15:15 MM $ perl5.8 -e '{print `cat ~/MM`}' MM 如您所观察到的,删除它将恢复错误:

$ /bin/rm -r \~ $ ls -l \~ ~: No such file or directory $ perl5.8 -e '{print `cat ~/MM`}' cat: cannot open ~/MM
这提供了一个似是而非的解释,虽然我不是100%,但不可能有其他解释。

正如前面的回答所述,~tilde是由shell扩展的,而不是由perl扩展的。 最有可能的原因是,当前目录中存在一个目录~而该目录最终被删除,导致出现错误:

举例说明:

Tilde不在Perl中工作,使用$ENV{HOME}工作:

$ echo MM > MM $ perl5.8 -e '{print `cat ~/MM`}' cat: cannot open ~/MM $ perl5.8 -e '{print `cat $ENV{HOME}/MM`}' MM 使波浪形命名目录生效:

$ mkdir \~ $ echo MM > \~/MM $ ls -l \~ -rw-rw-r-- 1 DVK users 3 Jun 10 15:15 MM $ perl5.8 -e '{print `cat ~/MM`}' MM 如您所观察到的,删除它将恢复错误:

$ /bin/rm -r \~ $ ls -l \~ ~: No such file or directory $ perl5.8 -e '{print `cat ~/MM`}' cat: cannot open ~/MM
这提供了一个似是而非的解释,尽管我不是100%不可能有其他人。

正如问题中所述,它一直在工作,今天突然停止工作……正如问题中所述,它一直在工作,今天突然停止工作……这些都是很好的答案,只是它一直在工作。那么,为什么它在某一点上起作用,以及有什么可以改变它,使它停止工作呢。为了证明它们是一样的,这里有一个与一周前不同的快照:>cp.snapshot/weekly.1/find.pl~/tmp>diff~/tmp/find.pl~/bin/find.pl 96c96if$output eq{$output eq{$output=$ENV{HOME}/tmp/find{$strings[0].rslt}你看过你贴的东西了吗?我在这两个字符串中都没有看到a~。奇怪的是,我在原始帖子中看到了波浪形文字。@lexu查看unknown在上面的评论,他声称自己的代码用于处理文件名中的a~。他在评论中有两条路径:/mrvl/anhomes/$ENV{'USER'}/tmp/find_$strings[0]。rslt和$ENV{HOME}/tmp/find_$strings[0]。rslt都没有波浪线。@sinan-你说得对。隐马尔可夫模型。。。我的大坏蛋。。。我想也许我从来没有用过~。也许是我下面的目录结构改变了。我想我只需要确保我的小助手写得更好。谢谢大家的帮助!堆积如山的岩石!这些都是很好的答案,只是它起作用了。那么,为什么它在某一点上起作用,以及有什么可以改变它,使它停止工作呢。为了证明它们是一样的,这里有一个与一周前不同的快照:>cp.snapshot/weekly.1/find.pl~/tmp>diff~/tmp/find.pl~/bin/find.pl 96c96if$output eq{$output eq{$output=$ENV{HOME}/tmp/find{$strings[0].rslt}你看过你贴的东西了吗?我在这两个字符串中都没有看到a~。奇怪的是,我在原始帖子中看到了波浪形文字。@lexu查看unknown在上面的评论,他声称自己的代码用于处理文件名中的a~。他在评论中有两条路径:/mrvl/anhomes/$ENV{'USER'}/tmp/find_$strings[0]。rslt和$ENV{HOME}/tmp/find_$strings[0]。rslt都没有波浪线。@sinan-你说得对。隐马尔可夫模型。。。我的大坏蛋。。。我想也许我从来没有用过~。也许是我下面的目录结构改变了。我想我只需要确保我的小助手写得更好。谢谢大家的帮助!堆积如山的岩石!您的环境发生了什么变化,导致程序突然停止工作?我不确定。这些天他们做了很多改变,所以我不确定是哪一个造成了这个问题。他们正准备将我们的服务器转移到全国各地!您的环境发生了什么变化,导致程序突然停止工作?我不确定。这些天他们做了很多改变,所以我不确定是哪一个造成了这个问题。他们正准备将我们的服务器转移到全国各地!