
Итак, я привыкаю к неизменяемым переменным в puppet, теперь ищу совета или разъяснения, нахожусь ли я уже на правильном пути.
У меня есть каталог, который я хотел бы синхронизировать, но потенциально и несколько его подкаталогов. Поэтому я хотел бы создать массив из одного или нескольких путей для передачи в рекурсивныйфайлресурс. В идеале, я бы хотел что-то вроде этого
$paths = ['fist/path'] # assume this is provided via class parameter
# this should work, since it's only overriding what was provided from higher scope
if($condition) {
$paths += 'second/path'
}
# this won't fly, since $paths has already been set once locally
if($another_condition) {
$paths += 'third/path'
}
но я не могу этого сделать, верно, поскольку переменные неизменяемы. То, что я придумал как 'лучший' подход на данный момент, это что-то вроде этого
$paths = ['fist/path']
if($condition) {
$condition_1_path = ['second/path']
} else {
$condition_1_path = []
}
if($another_condition) {
$condition_2_path = ['third/path']
} else {
$condition_2_path = []
}
$paths = concat($paths, $condition_1_path, $condition_2_path)
Я не уверен, есликонкатисключит запись из результата, если в качестве одного из аргументов указан пустой массив, но подождите, чтобы проверить это, как только явыяснить, как загрузить stdlib.
В любом случае, глядя на этот код, для меня он просто отвратительный. Есть ли более чистый способ сделать что-то подобное?
решение1
Это некрасиво, но я сделал это именно так.
if($condition) {
$condition_1_path = 'first/path'
} else {
$condition_1_path = ''
}
if($another_condition) {
$condition_2_path = 'second/path'
} else {
$condition_2_path = ''
}
# split into array based on whitespace
$mylistofpaths = split("$condition_1_path $condition_2_path", '\s+')