在Perl中使用双冒号进行奇数字符串解析

n0p*_*0pe 4 string perl parsing colon

我用Perl字符串解析偶然发现了一些奇怪的东西.这是一个例子:

$word = "hello";
$test1 = "colon:values::$word:test";
$test2 = "colon:values::$word::test";

// test1 prints: "colon:values::hello:test"
// test2 prints: "colon:values::"
Run Code Online (Sandbox Code Playgroud)

因此,如果Perl在字符串中的变量之后看到双冒号,它(我假设)会认为您正在尝试使用包名称.我猜它正在尝试加载"Hello :: test"而没有找到任何东西 - 因此提前终止字符串.

这是正常的吗?我觉得这很反直觉.我能够通过逃避第一个冒号来解决它:

$works = "colon:values::$word\::test";
Run Code Online (Sandbox Code Playgroud)

这是一个错误还是我完全错过了一些明显的东西?

Oes*_*sor 8

虽然这有效,但处理案例的更广泛的方法是使用大括号消除变量的名称:

perl -E "my $word = 'red'; say qq|colon::values::${word}::test|"
colon::values::red::test
Run Code Online (Sandbox Code Playgroud)

这在perldata中有记录:

与在某些shell中一样,您可以将变量名称括在大括号中,以便将其与下面的字母数字(和下划线)消除歧义.在将变量插入字符串以将变量名称与后面的双冒号或撇号分隔时,您还必须执行此操作,因为这些将被视为包分隔符:

$who = "Larry";
print PASSWD "${who}::0:0:Superuser:/:/bin/perl\n";
print "We use ${who}speak when ${who}'s here.\n";
Run Code Online (Sandbox Code Playgroud)

没有大括号,Perl会寻找a $whospeak,a $who::0$who's变量.最后两个是(推测)不存在的包中$0$s变量和变量who.