在perl中的一行上声明多个变量

时间:2014-04-12 14:35:07

标签: perl

我发现我可以使用以下命令在一个语句中声明两个变量:

my ($a,$b)=(1,2);

但我认为这种语法可能会令人困惑,例如,如果我们有五个变量声明,那么很难看出哪个值属于哪个变量。所以我认为如果我们可以使用这种语法会更好:

my $a=1, $b=2;

我想知道,为什么在Perl中这种声明是不可能的?还有其他选择吗?

(我试图避免为每个声明重复my,例如:my $a=1; my $b=2;

6 个答案:

答案 0 :(得分:17)

我是Perl的新手,但我会告诉你到目前为止我学到了什么。

我将改为使用$start$end代替$a$b,因为$a$b是始终声明的特殊变量。

要回答原始问题,您可以在一行中声明和分配多个变量,如下所示:

my ($start, $end) = (1, 2);

就我个人而言,我发现大约相同的打字并且不清楚,而不是单独一行:

my $start = 1;
my $end = 2;

但是,我认为将子程序参数分配给命名变量很有用,因为子程序参数位于名为@_的列表中:

use strict;

sub print_range {
    my ($start, $end) = @_;
    print "Range is from $start to $end.\n";
}

print_range(10, 20); # => Range is from 10 to 20.

您可以在the documentation中看到my语句的更多怪癖,包括忽略列表中某些值的方法。

答案 1 :(得分:16)

没有。 my声明的变量仅在下一个语句开始时命名。您可以分配给新创建的变量的唯一方法是分配给它返回的变量。将my视为同时声明的new

至于您的特定代码,

my $a=1, $b=2;

装置

((my $a)=1), ($b=2);

显然,没有好处。

如果您使用过尚未声明 [1] 的变量,则会出现严格错误。


  1. $a$b在每个命名空间中预先声明,以方便sort的使用。

答案 2 :(得分:7)

下面是在perl中在一行中声明多个变量的方法:

我($ day,$ mon,$ year,$ hr,$ min,$ sec)=(0)x 6;

这里,所有上述变量都已用0初始化。重复运算符' x'用来。

答案 3 :(得分:0)

为避免在这些情况下出现混淆,通常可以这样做:

my ($a, $b, $c, $d) = (
  1,  # => $a
  2,  # => $b
  3,  # => $c
  4   # => $d
);

根据KISS principle


池上注意到另一种选择是:

my $a = 1;
my $b = 2;
my $c = 3;
my $d = 4;

答案 4 :(得分:0)

对于变量声明,我认为my ($a,$b)=(1,2);绝对足够。

但是对于哈希值初始化,您可以使用此语法...

my $stuff = {};

$stuff->{hello} = $stuff->{thing} = 123;

print(Dumper($stuff));

这里的结果将是...

$VAR1 = {
      'hello' => 123,
      'thing' => 123
};

这很整洁,因为您可以将不同数组不同键初始化为相同的值。

您只能为每个值使用相同的值,但这对于哈希初始化来说可能是完美的选择。

答案 5 :(得分:-1)

我采用了这种方法。

map { ($_) = '' } my ($x, $y, $z);

将数字替换为 0 的 ''。

你不需要计算任何东西。

我把 $_ 放在 () 中是为了让 perlcritic 误以为我知道我在做什么 :)

我能想到的对变量值使用此方法的唯一方法是执行以下操作:-

my @v = (1,23,'Bill',41);
map {($_) = shift @v} my ($x,$y,$r,$s);

或者如果已经定义了一些:-

my $x = 7;
my @v = (1,23,'Bill',41);
map {($_) = shift @v} ($x,my ($y,$r,$s));