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

ste*_*nmm 1 unix linux perl

我一直在使用我的这个脚本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 : $!";
Run Code Online (Sandbox Code Playgroud)

关于为什么会突然停止工作的任何想法?

错误看起来像:

cant open stephen/tmp/find_coverp.rslt : No such file or directory at /user/stephen/bin/find.pl line 137.
Run Code Online (Sandbox Code Playgroud)

DVK*_*DVK 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. 使波浪号命名目录起作用:

    $ 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
    

这提供了一个似是而非的解释,虽然我不是100%,但不可能有其他人.