dans mon script Perl, je reçois des chaînes de chemins de fichiers pouvant contenir des variables d'environnement, par exemple. Je veux maintenant ouvrir ces fichiers tels que ceci: p> $ polices / test.ttff code> ou
$ tmp / fichier.txt code>.
open my $handle, "<$filename" or die $!;
4 Réponses :
Si les variables environnementales sont définies, vous pouvez utiliser une simple substitution:
Neat et succinct - et, comme toujours, le traitement des erreurs le fera bu. Spécifiquement, si l'une des variables d'environnement référencées n'est pas définie, vous obtiendrez au mieux un chemin imprévu. Vous pouvez également obtenir des avertissements sur l'accès à des variables non définies de Perl. Bien qu'il existe d'autres notations shell (comme $ {tmp} code>), ils sont rarement utilisés dans des contextes où cela posera un problème.
@Jonathan, le comportement standard pour bash consiste à substituer la chaîne vide pour une variable manquante, ce code gère donc cette condition d'erreur de la manière dont l'OP a demandé. Je suis d'accord sur les notations de rechange alternatives que j'utilise $ {foo:?} Code> beaucoup dans les scripts pour forcer bash pour lancer des erreurs sur des variables non définies.
J'ai mis à jour cela sur S / \ $ \ \ {? (\ W +) \ \}? / $ Env.
Eh bien, ce qui suit est considérablement plus verbeux, mais il
Semble de gérer correctement les deux voici un échantillon d'exécution ... P> dans cette version, les symboles non définis sont remplacés par une chaîne vide,
comme la coquille. Mais dans mes applications, je préférerais laisser le non expandiné
Symbole non valide en place, ce qui facilite la voir ce qui s'est mal passé.
En outre, si vous bousillez votre support correspondant, la coquille sera
vous donner une erreur "mauvaise substitution", mais ici nous allons juste revenir
la corde avec le symbole cassé toujours en place. p> p> $ foo code> et
$ {foo} code> syntaxe.
Désolé, mais vous avez tort.
travailler dans Perl avec des variables de shell, la syntaxe correcte est la suivante: $ env (variable} p>
Exemple avec une fonction de sortie GCC colorée: P> < Pré> xxx pré> p>
Pourquoi ne pas simplement faire cela:
$filename =~ s/\$\{(\w+)\}/$ENV{$1}/g; $filename =~ s/\$(\w+)/$ENV{$1}/g;
Vous voulez vraiment utiliser un 3 arg ouvert ici pour éviter une vulnérabilité de sécurité.
Peut aussi bien fournir des liens: Stackoverflow.com/Questtions/318789/... Stackoverflow.com/questions/1479741/... a >