2009-06-10 6 views
1

J'ai utilisé ce script FOREVER et j'ai toujours utilisé "~ /" pour développer mon répertoire personnel. Je me mets au travail aujourd'hui et il a cessé de fonctionner:

#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 : $!"; 

Des idées sur les raisons pour lesquelles cela arrêterait brusquement de s'arrêter?

erreur ressemble:

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

Qu'est-ce qui a changé dans votre environnement que le programme a soudainement cessé de fonctionner? –

+0

Je ne suis pas sûr. Ils font beaucoup de changements ces jours-ci, donc je ne suis pas sûr de savoir lequel pourrait avoir causé le problème. Ils se préparent à déplacer nos serveurs à travers le pays! – stephenmm

Répondre

3

L'expansion du tilde n'est pas effectuée par perl, elle est effectuée par le shell.

Vous devriez utiliser:

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

Ce sont de bonnes réponses, sauf que cela fonctionnait. Alors pourquoi cela a-t-il fonctionné à un moment donné et qu'est-ce qui aurait pu changer pour que ça cesse de fonctionner? Juste pour prouver qu'ils sont les mêmes ici est une diff de l'instantané d'une semaine: > cp .snapshot/weekly.1/find.pl ~/tmp > diff ~/tmp/find.pl ~/bin/find .pl 96c96 if ($ output eq "") {$ output = "$ ENV {HOME}/tmp/find_ $ strings [0] .rslt"} #WORKS – stephenmm

+1

Avez-vous lu ce que vous avez posté? Je ne vois pas de ~ dans ces deux chaînes. –

+0

Étrange, je vois le tilde dans le message original. – lexu

0

~ est dilatée par le shell. Perl n'a aucune idée à ce sujet. Donc, cela ne fonctionnerait que dans un script shell.

+0

Comme indiqué dans la question, il a travaillé pour toujours et a soudainement cessé de fonctionner aujourd'hui ... – stephenmm

7

Comme indiqué par réponse avant, "~" (tilde) est dilatée par shell, perl pas. Très probablement, il travaillait en raison de l'existence d'un répertoire « ~ » dans votre répertoire courant, ce qui a finalement obtenu enlevé, menant au revêtement de bug:

À titre d'illustration:

  1. Tilde ne fonctionne pas dans Perl, en utilisant $ ENV {HOME} fonctionne:

     
    $ echo MM > MM 
    $ perl5.8 -e '{print `cat ~/MM`}' 
    cat: cannot open ~/MM 
    $ perl5.8 -e '{print `cat $ENV{HOME}/MM`}' 
    MM 
    
  2. au répertoire de tilde nommé fonctionne:

     
    $ 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. Suppression restaure l'erreur, que vous avez observé:

     
    $ /bin/rm -r \~ 
    $ ls -l \~ 
    ~: No such file or directory 
    $ perl5.8 -e '{print `cat ~/MM`}' 
    cat: cannot open ~/MM 
    

Cette offre une explication plausible, bien que je ne suis pas 100%, il ne peut y avoir d'autres.

+0

+1 sauf que c'est "tilde" – SqlACID

Questions connexes