Pregunta
Estoy tratando de asignar una constante en la parte superior de un script de Perl como así:
use constant {
# ...
CONSTNAME => qx{readlink -e __FILE__} || __FILE__,
# ...
};
__FILE__
no se interpola dentro del qx
operador, lo que hace que esto falle. ¿Cómo puedo lograr lo que quiero, que es interpolar el __FILE__
antes de vocación readlink
del caparazón.
Tenga en cuenta: no es una opción almacenar el comando dentro de una variable intermedia en el medio.
Solución
Para responder a la pregunta directamente, puede usar el idioma interpolato-arbitrary-expresion-in-string descrito en perlref:
print qx{echo @{[ __FILE__ ]}};
Un par de advertencias planteadas en los comentarios:
- los
[]
Contexto de la lista de suministros. Eso no importa aquí, pero vale la pena ser consciente en general. - Puedes meterte en problemas si
__FILE__
tiene metacrojadores de concha.
Si su objetivo es encontrar el camino de su script Perl con todos los enlaces simbólicos resueltos, es posible que desee mirar el FindBin
módulo. FindBin
ha sido parte de la distribución central de perl durante algún tiempo (al menos desde 5.004 según http://search.cpan.org/~chips/perl5.004/).
Otros consejos
Una solución totalmente perfecta:
my $self = $0;
while( -l $self ){
$self = readlink $self;
}
use constant {
# ...
CONSTNAME => $self,
# ...
};
Usar readpipe
la función equivalente de qx//
. Interno a perl qx//
principalmente se comporta como qq//
y luego pasa el resultado a readpipe
. Cuando el comportamiento de citas de qx//
se interpone en la forma en que puedes pasar por alto y llamar readpipe
directamente.
use constant {
CONSTNAME => readpipe('readlink -e ' . quotemeta(__FILE__)) || __FILE__,
};
quotemeta
ayudará a protegerse contra posibles ataques de shell metacharacter en el nombre del archivo.