Come usare __file__ all'interno di QX?
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.
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.