为什么perl无法识别我要创建带有“ split”的arrayRef?

时间:2019-05-17 07:24:26

标签: perl

我想用空格分割标量,然后将结果保存在ArrayReference中。

use strict;
use warnings;

use Data::Dumper;

my $name = 'hans georg      mustermann';
my $array = split ' ', $name;

print Dumper($array);     #$VAR1 = 3;

所以看来$array现在是由size操作产生的split的标量。

当我将代码更改为my $array = [split ' ', $name];时,变量$array现在是ArrayReference并包含所有3个字符串。

我只是不了解这种行为。如果有人可以向我解释一下或发布关于这些事情的优质文档,那将是非常不错的,因为我不知道如何搜索该主题。

提前谢谢

3 个答案:

答案 0 :(得分:5)

您在此处看到的称为“上下文”。关于此的文档相当分散。您还想看一下有关“标量与列表上下文” https://perlmaven.com/scalar-and-list-context-in-perl

的教程。

如果将split(或任何子例程调用)结果分配给数组,则为列表上下文:

my @arr = split ' ', $name;
#=> @arr = ('hans', 'georg', 'mustermann');

您的示例代码显示的是将它们分配给标量-因此它在“标量上下文”下。

由于自然而然地,不能将多个事物放在一起,所以需要进行某种汇总。对于split函数,perl5定义为split结果中的元素数应为最佳。

检查split函数的文档:https://perldoc.pl/functions/split-实际上定义了标量上下文以及列表上下文下的行为。

还可以浏览https://perldoc.pl/functions上所有内置函数的文档-大多数都可以在“列表上下文”和“标量上下文”下找到行为定义-尽管其中许多是不返回“列表大小”,而是返回其他内容。

答案 1 :(得分:2)

那叫context

部分表达式split ' ', $name的结果为一个列表。部分表达式$array = LIST将列表强制为标量值,即计算列表中元素的数量。这是标量上下文中列表的默认行为。

您应该使用数组变量而不是标量变量来写@array = LIST,以保留列表值。

答案 2 :(得分:2)

如果您阅读documentation for split(),则会发现解释函数返回内容的位。

  

将字符串EXPR拆分为字符串列表,并在列表上下文中返回列表,或者在标量上下文中返回列表的大小。

您要在标量上下文中调用该函数(因为将调用结果分配给标量变量),因此您可以获取列表的大小。

如果要获取列表,则需要将其存储在变量列表中:

my ($forename, $middlename, $surname) = split ' ', $name;

或者(通常)在数组中:

my @name_parts = split ' ', $name;

但是实际上,您说的是想要数组引用。您可以通过在匿名数组构造函数(split()中调用[ ... ]并将该调用的结果分配给标量变量来实现。

my $name_parts = [ split ' ', $name ];