我一直在使用我的这个脚本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.
答案 0 :(得分:7)
如前面的回答所述,“~
”(代字号)由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
使代号为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
删除它会恢复错误,如您所见:
$ /bin/rm -r \~ $ ls -l \~ ~: No such file or directory $ perl5.8 -e '{print `cat ~/MM`}' cat: cannot open ~/MM
这提供了一个似是而非的解释,虽然我不是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)
~
。 Perl对此一无所知。因此,它只能在shell脚本中工作。