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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top