Почему мой Perl-скрипт не работает на "~ /", но работает с "$ ENV {HOME}"? - PullRequest
1 голос
/ 10 июня 2009

Я использовал этот скрипт навсегда и всегда использовал «~ /» для расширения своего домашнего каталога. Сегодня я приступаю к работе, и она перестала работать:

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

7 голосов
/ 10 июня 2009

Как указано в предыдущем ответе, "~" (тильда) расширяется оболочкой, а не perl. Скорее всего, он работал из-за наличия в текущем каталоге каталога "~", который в итоге был удален, что привело к появлению ошибки:

Для иллюстрации:

  1. Тильда не работает в 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%, не может быть других.

3 голосов
/ 10 июня 2009

Расширение тильды выполняется не perl, а оболочкой.

Вместо этого вы должны использовать:

 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': $!";
0 голосов
/ 10 июня 2009

~ расширяется оболочкой. Perl понятия не имеет об этом. Таким образом, это будет работать только внутри сценария оболочки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...