LINUX.ORG.RU

bash-like подстановка переменных в perl

 ,


1

3

Всем привет.

В баше есть очень удобные конструкции, которые позволяют просто создавать текстовые динамические темплейты. Т.е, выводить на основе одного темплейта разный текст, в зависимости от установленных переменных.

printf "\
  name: $name
  role: $role
${deps:+    deps: [$deps]}
${whatever:+    whatever: [$whatever]}
"

Не могу сообразить, в perl без привлечения cpan можно что-то подобное сделать? Гуглил про variable expanstion, substitution, но ничего не нашел.

★★★

в perl без привлечения cpan можно что-то подобное сделать?

Глупое ограничение на самом деле

annulen ★★★★★
()

А зачем в BASH-примере printf, если можно то же самое echo? printf для подстановки по шаблону...

DRVTiny ★★★★★
()

В баше это делается так

cat << ENDOFTEMPLATE
  name: $name
  role: $role
${deps:+    deps: [$deps]}
${whatever:+    whatever: [$whatever]}
ENDOFTEMPLATE

В перле так:

$str = "kuku";
print <<EOF;
This is
a multiline $str
string
EOF

futurama ★★★★★
()
Последнее исправление: futurama (всего исправлений: 2)
Ответ на: комментарий от DRVTiny

Там писался пример на скорую руку и не совсем правильно. Вот тут переписал правильно. printf используется для возможности писать переменные на каждой строке и при этом не иметь разрыва, если переменная не определена:

$ cat test.sh 
#!/bin/sh

name=bin1
role=bin1

printf "\
  name: $name
  role: $role
${deps:+    deps: [$deps]\n} \
${whatever:+    whatever: [$whatever]\n} \
  settings:
    var1: value1
"
$ whatever="mywhatever1, mywhatever2" ./test.sh 
  name: bin1
  role: bin1
     whatever: [mywhatever1, mywhatever2]
   settings:
    var1: value1
$ ./test.sh 
  name: bin1
  role: bin1
    settings:
    var1: value1

C echo это можно сделать, используя, по-моему -n(Обработку переменных \x), но здесь проблема в том, что echo это иногда отдельная утилита, иногда функция шелла. И в зависимости от шелла может вести себя по-разному. Короче не posix-совместимо. А printf posix совместимый, с ним на разных posix системах можно обеспечить одно и тоже поведение.

Я не в курсе, можно ли EOF получить такое же поведение.

Valmont ★★★
() автор топика
Ответ на: комментарий от futurama

Проблема не в многострочной переменной, а в специфической обработке переменных, см. предыдущий мой комментарий.

Valmont ★★★
() автор топика
Ответ на: комментарий от Valmont

В BASH echo -e реагирует на \x. А ещё можно вставлять в обычный echo вот такие переводы строк: $'\n'

$ echo "Перевод "$'\n'"строки"
Перевод 
строки

DRVTiny ★★★★★
()
Ответ на: комментарий от DRVTiny

Не проще ли везде поставить BASH

Можно подумать, так трудно заюзать перевод строки оставаясь в рамках дремучего posix:

echo "Перевод
строки"

vodz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.