puppet regsubst多次换人

时间:2013-10-10 15:52:11

标签: ruby regex puppet

我需要将$name中的最后一位数字从1换算为2或2换算为1

在Ruby(irb)中我得到了像这样的工作

irb(main):038:0> name = "drdev-ams-1"
irb(main):059:0> name = name.sub(/[12]$/, '1' => 2, '2' => 1)
=> "drdev-ams-2"
irb(main):060:0> name = name.sub(/[12]$/, '1' => 2, '2' => 1)
=> "my_string-1"

在木偶2.7中如何实现同样的目标?

regsubst($name, '[12]$', "'1' => 2, '2' => 1")

这不会给出正确的结果。

1 个答案:

答案 0 :(得分:0)

在Ruby中这段代码

{ '1' => 2, '2' => 1 }

定义了一个hash,在您的情况下,子方法使用该hashes来替换任何与该哈希的键之一相等的搜索结果和该键的值。在Ruby中,当哈希是函数调用的最后一个参数时,可以省略大括号。以下两个调用是等效的:

name.sub(/[12]$/, '1' => 2, '2' => 1)
name.sub(/[12]$/, { '1' => 2, '2' => 1 })

Puppet有{{3}}自己的语法,几乎与Ruby的语法相同,这并不奇怪。您应该注意一些细微的差异。

首先,你在哈希周围加上双引号。这意味着Puppet解析器将生成一个字符串而不是一个哈希。此外,即使哈希是函数调用的最后一个参数,Puppet也需要括号。最后,Puppet不需要围绕哈希键的引号(尽管如果你提供它们并不重要)。但它没有相反的方法:在Ruby { hello => 'world' }中导致解析错误,而Puppet解析器理解这一点就好了。

在两个哈希之间理解你的Puppet代码只需要稍微调整一下:

regsubst($name, '[12]$', { '1' => 2, '2' => 1 } )

以下是有效的证据:

$x1 = "drdev-ams-1"
$x2 = "drdev-ams-2"
alert( "x1 = ${x1}" )
alert( "x2 = ${x2}" )
$y1 = regsubst($x1, '[12]$', { '1' => 2, '2' => 1 } )
$y2 = regsubst($x2, '[12]$', { '1' => 2, '2' => 1 } )
alert( "y1 = ${y1}" )
alert( "y2 = ${y2}" )

产生以下输出:

Alert: Scope(Class[main]): x1 = drdev-ams-1
Alert: Scope(Class[main]): x2 = drdev-ams-2
Alert: Scope(Class[main]): y1 = drdev-ams-2
Alert: Scope(Class[main]): y2 = drdev-ams-1

希望这有帮助。

顺便说一下,我也来自阿姆斯特丹。