Domanda

Sto cercando di assegnare una costante in cima a uno script perl come così:

use constant {
  # ...
  CONSTNAME => qx{readlink -e __FILE__} || __FILE__,
  # ...
};

__FILE__ non viene interpolato all'interno del qx operatore, che fa fallire questo. Come posso ottenere ciò che voglio, che è interpolare il __FILE__ prima chiamata readlink del guscio.

Nota: non è un'opzione per archiviare il comando all'interno di una variabile intermedia in mezzo.

È stato utile?

Soluzione

Per rispondere direttamente alla domanda, è possibile utilizzare il linguaggio interpolato-arbitrario-espressione nella stringa descritta in Perlref:

print qx{echo @{[ __FILE__ ]}};

Un paio di avvertimenti sollevati nei commenti:

  • Il [] contesto elencatura delle forniture. Non importa qui, ma vale la pena essere consapevole in generale.
  • Puoi metterti nei guai se __FILE__ ha metacharacter Shell.

Se il tuo obiettivo è trovare il percorso del tuo script Perl con tutti i collegamenti simbolici risolti, potresti voler guardare il FindBin modulo. FindBin fa parte della distribuzione Core Perl per qualche tempo (almeno dalle 5,004 secondo http://search.cpan.org/~chips/perl5.004/).

Altri suggerimenti

Una soluzione completamente perl:

my $self = $0;
while( -l $self ){
  $self = readlink $self;
}
use constant {
  # ...
  CONSTNAME => $self,
  # ...
};

Uso readpipe la funzione equivalente a qx//. Interno a Perl qx// principalmente si comporta come qq// e poi passa il risultato a readpipe. Quando il comportamento di citazione di qx// Entra nel modo in cui puoi bypassarlo e chiamare readpipe direttamente.

use constant {
    CONSTNAME => readpipe('readlink -e ' . quotemeta(__FILE__)) || __FILE__,
};

quotemeta Aiuterà a proteggersi da possibili attacchi di metacharacter con shell nel nome del file.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top