Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 使用带括号且只有一个变量的my_Perl - Fatal编程技术网

Perl 使用带括号且只有一个变量的my

Perl 使用带括号且只有一个变量的my,perl,Perl,我有时会看到这样的Perl代码: my ( $variable ) = blah.... 在单个变量周围加括号有什么意义?我认为括号只在声明多个变量时使用,例如: my ( $var1, $var2, $var3 ) = blah... 我不是Perl专业人士(当然不是),但恐怕这与列表有关。 Perl有不同的上下文(标量、列表)。使用($var)切换到列表上下文,$var是标量上下文 my $var = (1, 2, 4); # $var = 4 (last element) my ($v

我有时会看到这样的Perl代码:

my ( $variable ) = blah....
在单个变量周围加括号有什么意义?我认为括号只在声明多个变量时使用,例如:

my ( $var1, $var2, $var3 ) = blah...
我不是Perl专业人士(当然不是),但恐怕这与列表有关。 Perl有不同的上下文(标量、列表)。使用
($var)
切换到列表上下文,
$var
是标量上下文

my $var = (1, 2, 4); # $var = 4 (last element)
my ($var) = (1, 2, 4); # $var = 1

如果答案完全错误,请对其进行向下投票:)

括号创建了一个列表上下文,它会影响作业右侧的评估方式

比较

my $x = grep { /s/ } qw(apples bananas cherries);
print $x;


当。

您混淆了两个不同的事物时,通常会使用此结构。首先,当使用
my
声明多个变量时,需要使用括号:

my $foo, $bar;  
不起作用,因为它被认为是两种不同的说法:

my $foo;
$bar;
$foo;
$bar = "a";
"b";
因此,您需要使用括号将参数分组到函数
my
的参数列表中:

my($foo, $bar);
其次,为了调用列表上下文,您有显式分组:

$foo, $bar = "a", "b"; # wrong!
($foo, $bar) = ("a", "b");
my ($foo) = @array;          # $foo is set to $array[0], first array element
my ($bar) = ("a", "b", "c"); # $bar is set to "a", first list element
将被视为三个单独的声明:

my $foo;
$bar;
$foo;
$bar = "a";
"b";
但如果使用括号将
$foo
$bar
分组到列表中,赋值运算符将使用列表上下文:

$foo, $bar = "a", "b"; # wrong!
($foo, $bar) = ("a", "b");
my ($foo) = @array;          # $foo is set to $array[0], first array element
my ($bar) = ("a", "b", "c"); # $bar is set to "a", first list element
奇怪的是,如果你去掉右括号,你也会经历一个hickup:

($foo, $bar) = "a", "b"; # Useless use of a constant (b) in void context
但这是因为
=
运算符的优先级高于逗号
,可以在中看到。如果您尝试:

my @array = ("a", "b");
($foo, $bar) = @array;
没有括号,您将获得所需的行为

现在,为了完成这个循环,让我们删除上面的列表上下文,看看会发生什么:

my @array = ("a", "b");
$foo = @array;
print $foo;
这将打印
2
,因为数组是在标量上下文中计算的,而标量上下文中的数组返回它们包含的元素数。在这种情况下,它是
2

因此,此类语句使用列表上下文:

$foo, $bar = "a", "b"; # wrong!
($foo, $bar) = ("a", "b");
my ($foo) = @array;          # $foo is set to $array[0], first array element
my ($bar) = ("a", "b", "c"); # $bar is set to "a", first list element
这是一种重写标量赋值中隐含的标量上下文的方法。为了进行比较,这些赋值在标量上下文中:

my $foo = @array;            # $foo is set to the number of elements in the array
my $bar = ("a", "b", "c");   # $bar is set to "c", last list element

存在差异时有几种情况:

  • 数组位于右侧时

    my @array = ('a', 'b', 'c');
    my  $variable  = @array;           #  3   size of @array
    my ($variable) = @array;           # 'a'  $array[0]
    
    my  $variable  = qw/ a b c d /;    # 'd'  last  item of the list
    my ($variable) = qw/ a b c d /;    # 'a'  first item of the list
    
  • 列表位于右侧时

    my @array = ('a', 'b', 'c');
    my  $variable  = @array;           #  3   size of @array
    my ($variable) = @array;           # 'a'  $array[0]
    
    my  $variable  = qw/ a b c d /;    # 'd'  last  item of the list
    my ($variable) = qw/ a b c d /;    # 'a'  first item of the list
    
  • 带有变量(数组/标量)返回值的子例程

    sub myFunction {
      ...
      return (wantarray() ? @array : $scalar);
    }
    my  $variable  = myFunction(...);  # $scalar   from the subroutine
    my ($variable) = myFunction(...);  # $array[0] from the subroutine
    
  • 我已经在另一个网站上发布了关于这个主题的深入报道


    [我不能在这里发布。StackOverflow不支持表。这并不是说任何人通常在场外链接到文档时都会遇到问题。]

    如果很明显列表可能是未来的期望,那么它可能有助于维护。我通常在读取子程序参数时使用它,比如
    my($arg1)=@
    而不是
    my$arg1=shift
    我只是习惯于键入
    my(
    ),而且,一个项目的列表仍然是一个列表。:)有趣的是,
    my$foo=(“a”,“b”);打印$foo
    将打印
    b
    ,而不是
    2
    @knittl,因为只有数组才有这种行为,而不是列表。在标量上下文中,列表返回它们的最后一个元素。在标量上下文中实际上没有列表这样的东西。只有由逗号运算符的标量版本分隔的标量。这是一个与brian d foy,
    $x=(4,5,6)一样多的列表在标量上下文中有一个列表。请注意
    perl-MO=concurrence-e'$x=(4,5,6);'
    列表/逗号运算符不是像
    &&
    那样的二进制运算符。你说得对,
    $var=grep{;defined}(1,2,4)=3(项目)也
    my@a=(1,2,4);我的$v=@a;打印$v=3当
    $var=(1,2,4)
    将4分配给
    $var
    grep
    根据其上下文以特定的方式运行,在标量上下文中,它提供通过测试的列表元素的数量。这与标量上下文中列表的行为不同。@Borodin:是的,就像我在回答中所说的,它影响赋值运算符两边的求值方式(通过更改所使用的赋值运算符)。显然有人在异地链接到文档时遇到了问题。我通常建议在你的答案中添加一个摘要。@布拉德·吉尔伯特,重复已经说过4次的内容对我来说不是一件好事。如果你查看StackOverflow上的所有“仅链接”答案(包括已删除的答案),你会发现其中相当多是死链接。如果你的链接指向了一个没有出现那么久的地方,我可能也会投反对票。还有几种方法可以解决缺少表格的问题。@Brad Gilbert,是的,但我确实链接到了一个和PerlMonks一样存在很久的网站。我刚才指出了堆栈溢出的问题。