不使用eval从标量变量创建VSTRING

时间:2016-07-12 07:57:16

标签: perl type-conversion

我只是好奇, - 甚至可以从标量变量创建一个v-string而不诉诸"D:/TestFolder"

予。例如,这可行,但使用eval

eval

这两个变体也有效,并且不使用my $var = 'v1.2.3'; my $conversion = to_vstring_1($var); # Prints "Version: 1.2.3, type: VSTRING" printf("Version: %vd, type: %s\n", $conversion, ref \$conversion); sub to_vstring_1 { my ($arg) = @_; $arg =~ tr/0-9.//cd; $arg = 'v' . $arg; return eval $arg; } ,但它们打印“SCALAR”而不是“VSTRING”:

eval

那么,还有第四种方法吗?

1 个答案:

答案 0 :(得分:3)

  

甚至可以从标量变量创建一个v-string而不诉诸eval

是的,确实如此,但这是一种痛苦,并没有充分的理由。

您可以编写以下内容的XS代码:

  • 解析您的输入字符串
  • 将数字转换为其等效字符
  • 通过调用sv_magic
  • 为您的标量指定v-string魔法

但是,这正是toke.c中的内部函数Perl_scan_vstring所做的。为什么重新发明轮子?