Как оценить переменные оболочки в строке? - PullRequest
7 голосов
/ 16 августа 2010

В моем скрипте Perl я получаю строки с путями к файлам, которые могут содержать переменные среды, например, $FONTS/test.ttf или $TMP/file.txt.

Теперь я хочу открыть эти файлы следующим образом:

open my $handle, "<$filename" or die $!;

Как теперь я могу развернуть переменные окружения до вызова open, как, например, сделает оболочка bash?

Ответы [ 4 ]

13 голосов
/ 16 августа 2010

Если заданы переменные среды, вы можете использовать простую замену:

$filename =~ s/\$(\w+)/$ENV{$1}/g;
2 голосов
/ 10 июля 2014

Почему бы просто не сделать это:

$filename =~ s/\$\{(\w+)\}/$ENV{$1}/g;
$filename =~ s/\$(\w+)/$ENV{$1}/g;
0 голосов
/ 07 апреля 2013

извините, но вы не правы.

для работы в perl с переменными SHELL правильный синтаксис: $ ENV {variable}

пример с цветной функцией вывода GCC:

n=$(tput setaf 0)
r=$(tput setaf 1)
g=$(tput setaf 2)
y=$(tput setaf 3)
b=$(tput setaf 4)
m=$(tput setaf 5)
c=$(tput setaf 6)
w=$(tput setaf 7)
N=$(tput setaf 8)
R=$(tput setaf 9)
G=$(tput setaf 10)
Y=$(tput setaf 11)
B=$(tput setaf 12)
M=$(tput setaf 13)
C=$(tput setaf 14)
W=$(tput setaf 15)
END=$(tput sgr0)

colorgcc()
    {
    perl -wln -M'Term::ANSIColor' -e '
    m/not found$/ and print "$ENV{N}$`$ENV{END}", "$&", "$ENV{END}"
    or
    m/found$/ and print "$ENV{N}$`${g}", "$&", "$ENV{END}"
    or
    m/yes$/ and print "$ENV{N}$`${g}", "$&", "$ENV{END}"
    or
    m/no$/ and print "$ENV{N}$`$ENV{END}", "$&", "$ENV{END}"
    or
    m/undefined reference to/i and print "$ENV{r}", "$_", "$ENV{END}"
    or
    m/ Error |error:/i and print "$ENV{r}", "$_", "$ENV{END}"
    or
    m/ Warning |warning:/i and print "$ENV{y}", "$_", "$ENV{END}"
    or
    m/nsinstall / and print "$ENV{c}", "$_", "$ENV{END}"
    or
    m/Linking |\.a\b/ and print "$ENV{C}", "$_", "$ENV{END}"
    or
    m/Building|gcc|g\+\+|\bCC\b|\bcc\b/ and print "$ENV{N}", "$_", "$ENV{END}"
    or
    print; '
    }
0 голосов
/ 20 сентября 2012

Что ж, следующее значительно более многословно, но, похоже, правильно обрабатывает синтаксис $FOO и ${FOO}.

#!/usr/bin/env perl

use warnings;
use strict;

my $filename = $ARGV[0];
print(" GIVEN: <$filename>\n");
my $expanded = '';
my @parts = split(/(\$\w+)|(\${\w+})/, $filename);
foreach my $seg (@parts)
  {
    next if (not defined($seg));
    $seg = ($ENV{$1} || '')  if ($seg =~ m/\${?(\w+)}?/);
    $expanded .= $seg;
  }

print("IS NOW: <$expanded>\n");
print(`echo "  ECHO: <$filename>"`);  # How the shell did it.

Вот пример выполнения ...

$ ./expand '$TERM ---${TERM}--- ===${FOO}=== $FOO'
 GIVEN: <$TERM ---${TERM}--- ===${FOO}=== $FOO>
IS NOW: <xterm-color ---xterm-color--- ====== >
  ECHO: <xterm-color ---xterm-color--- ====== >
$

В этой версии неопределенные символы заменяются пустой строкой, как оболочка.Но в моих приложениях я бы предпочел оставить нерасширенный недействительный символ на месте, чтобы было легче увидеть, что пошло не так.Кроме того, если вы испортили соответствие скобок, оболочка выдаст вам ошибку «неправильная замена», но здесь мы просто вернем строку с разбитым символом, который все еще находится на месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...