我想用空格分割标量,然后将结果保存在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个字符串。
我只是不了解这种行为。如果有人可以向我解释一下或发布关于这些事情的优质文档,那将是非常不错的,因为我不知道如何搜索该主题。
提前谢谢
答案 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 ];