3

是否可以在 perl 中创建一个字符串变量数组,而不必指定数组中的每个字符串?就像使用字母和数字的“..”快捷方式一样。

例如:

$v1 = "hey";
$v2 = "hello";
$v3 = "bye";
$v4 = "welcome";

@f = ("$v1" .. "$v4");

这样打印 $f[2]; 等于“再见”...

4

4 回答 4

2

我对这种方法并不感到兴奋,但你可以这样做:

$v1 = "hey";
$v2 = "hello";
$v3 = "bye";
$v4 = "welcome";

@f = map{eval "\$v$_"}1..4;
于 2012-10-24T20:21:14.260 回答
1

是你的意思吗?

my @v = qw/hey hello bye welcome/;

print join "\n", @v;

创建ARRAY后,您可以访问任何项目

print $v[0];

在我们的例子中, : hey0的索引在哪里。ARRAY

于 2012-10-24T20:12:55.683 回答
1

我猜你可以用 eval 写一个程序来做这件事,但为什么要首先使用 $v1, $v2 呢?为什么不从数组开始?

或者,根据你真正需要做的事情,使用类似的东西

@f = qw(hey hello bye welcome);

于 2012-10-24T20:13:16.720 回答
1

这可以(但可能不应该)通过使用来解决no strict 'refs'。而且巧合的是no strict 'vars'

use strict;
use warnings;
use Data::Dumper;

{
    no strict 'vars';
    $v1 = "hey";
    $v2 = "hello";
    $v3 = "bye";
    $v4 = "welcome";

    no strict 'refs';
    my @f = map ${'v'.$_},1..4;
    print Dumper \@f;
}

输出:(无警告)

$VAR1 = [
          'hey',
          'hello',
          'bye',
          'welcome'
        ];

我们需要no strict 'vars',因为我们实际需要引用的变量是(真的)命名$main::v1的等等。我们实际上可以no strict 'vars'通过使用完整的名称来解决需要。如果你根本不使用严格,这甚至都不是问题。虽然不使用strict与通过在警告灯上贴标签来解决汽车发动机问题一样聪明:它不会挽救您的发动机故障。

你应该这样做吗?几乎不。总有办法绕过它。但这样做并没有大错特错,假设你不会因为这样的作弊而过火。

正确的方法是使用$v1, ...代替$v1000使用$v[0], ... $v[1000]。也就是说,立即将值分配给数组。

于 2012-10-24T21:11:00.427 回答