Perl one-liner для расширения переменных среды Unix - PullRequest
2 голосов
/ 08 октября 2011

У меня есть Perl-скрипт, который выполняет работу по расширению переменных среды Unix.Скрипт работает нормально.Сценарий выглядит следующим образом:

# I know this should not be typed here. This is here just for testing.
@ENV{qw(LKUP_DIR DATA_DIR CTRL_DIR MMM)} = qw(/appl1/TSS/lkup /appl1/TSS/data /appl1/TSS/ctrl Oct);
while ( <DATA> )
{
  my $line=$_;
  chomp $line;
  $line =~ s{\$(\w+)}{ exists $ENV{$1} ? $ENV{$1} : '$'.$1 }ge;
  $line =~ s{\$\{(\w+)\}}{ exists $ENV{$1} ? $ENV{$1} : '${'.$1.'}' }ge;
  print "$line\n";
}

__DATA__
${LKUP_DIR}/lookup_file.txt
${CTRL_DIR}/ctrl_file_$MMMM.txt
$CTRL_DIR/ctrl_file_$MMM.txt

Я хочу преобразовать этот сценарий в однострочник, но я не уверен, как обрабатывать одинарные кавычки вокруг $ в регулярном выражении, используемом в сценарии, упомянутом выше.,Я попробовал ниже, но, конечно, это не работает:

perl -lne '$line=$_; $line =~ s{\$(\w+)}{ exists $ENV{$1} ? $ENV{$1} : '$'.$1 }ge; $line =~ s{\$\{(\w+)\}}{ exists $ENV{$1} ? $ENV{$1} : '${'.$1.'}' }ge; print "$line";' DATA.txt

Есть предложения?(Я хочу сделать это только в Perl.)

Ответы [ 2 ]

2 голосов
/ 08 октября 2011

Вот более краткая версия вашего скрипта.Заметное отличие состоит в том, что я использую // вместо exists.Я думаю, что разница в том, что касается переменных среды, будет незначительной.Если переменная среды существует, но не определена, что это?Если он действительно будет неопределенным, он будет вызывать предупреждение при печати Perl.

perl -wpe 's#\${?(\w+)}?# $ENV{$1} // $& #ge;' DATA.txt

Если вы все еще настаиваете на использовании exist, просто используйте:

perl -wpe 's#\${?(\w+)}?# exists $ENV{$1} ? $ENV{$1} : $& #ge;' DATA.txt

Что яСделано:

  • Удалена бесполезная переменная перехода $line
  • Удалено -l опция
  • Обмен -n и print с -p
  • Измените разделитель для подстановки, чтобы не было необходимости экранировать {}
  • Объедините регулярные выражения, добавив }? в качестве необязательного соответствия
  • Используется $& - все совпадение -- вместо того, чтобы пытаться разгадать части матча вместе
2 голосов
/ 08 октября 2011

Я согласен с @Mat: это кажется плохой идеей.Это будет всего одна строка, но вы потеряете на удобочитаемости.Просто подумайте, что вы можете отредактировать год спустя и все же попытаться понять, что делает один вкладыш.

Но в любом случае в Perl вы можете использовать q/STRING/ вместо 'STRING'.

perl -lne '$line=$_; $line =~ s{\$(\w+)}{ exists $ENV{$1} ? $ENV{$1} : q/$/.$1 }ge; $line =~ s{\$\{(\w+)\}}{ exists $ENV{$1} ? $ENV{$1} : q/${/.$1.q/}/ }ge; print "$line";' DATA.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...