gpt4 book ai didi

perl - 在不使用 eval 的情况下从标量变量创建 VSTRING

转载 作者:行者123 更新时间:2023-12-04 06:40:12 24 4
gpt4 key购买 nike

我只是很好奇, - 是否甚至可以从标量变量创建一个 v 字符串而不求助于 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;
}

这两个变体也有效,并且不使用 eval ,但他们打印“SCALAR”而不是“VSTRING”:
my $conversion_2 = to_vstring_2($var);
# Prints "Version: 1.2.3, type: SCALAR"
printf("Version: %vd, type: %s\n", $conversion_2, ref \$conversion_2);

my $conversion_3 = to_vstring_3($var);
# Prints "Version: 1.2.3, type: SCALAR"
printf("Version: %vd, type: %s\n", $conversion_3, ref \$conversion_3);

sub to_vstring_2 {
my ($arg) = @_;

$arg =~ tr/0-9.//cd;
$arg = pack('U*', split(/\./, $arg));

return $arg;
}

sub to_vstring_3 {
my ($arg) = @_;

$arg =~ tr/0-9.//cd;
$arg =~ s/[._]?(\d+)/chr($1 & 0x0FFFF)/eg;

return $arg;
}

那么,有没有第四种方法呢?

最佳答案

is it even possible to create a v-string from a scalar variable without resorting to eval?



是的,确实如此,但这很痛苦,而且没有充分的理由。

您可以编写 XS 代码:
  • 解析您的输入字符串
  • 将数字转换为其等效字符
  • 通过调用 sv_magic 为您的标量分配 v-string 魔法

  • 然而,这正是内部函数 Perl_scan_vstringtoke.c做。为什么要重新发明轮子?

    关于perl - 在不使用 eval 的情况下从标量变量创建 VSTRING,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38323066/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com