1

我需要将最后一位数字$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"

在 puppet 2.7 中如何实现相同的目标?

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

这不会给出正确的结果。

4

1 回答 1

0

在 Ruby 中,这段代码

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

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

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

Puppet 有自己的hashes语法,这与 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

希望这可以帮助。

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

于 2013-10-12T11:20:22.403 回答