为什么我的Perl脚本在“〜/”上失败但与“$ ENV {HOME}”一起使用?

时间:2009-06-10 17:14:28

标签: linux perl unix

我一直在使用我的这个脚本FOREVER,我一直用“〜/”来扩展我的主目录。我今天上班了,它停止了工作:

#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.

3 个答案:

答案 0 :(得分:7)

如前面的回答所述,“~”(代字号)由shell扩展,而不是perl。 最有可能的是,由于当前目录中存在目录“~”,它最终被删除,导致出现错误:

举例说明:

  1. 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
    
  2. 使代号为tilde的目录有效:

    $ 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
    
  3. 删除它会恢复错误,如您所见:

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

答案 1 :(得分:3)

波浪扩展不是由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': $!";

答案 2 :(得分:0)

shell扩展了

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