Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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中标量上下文和列表上下文之间的区别是什么?_Perl_List_Scalar - Fatal编程技术网

Perl中标量上下文和列表上下文之间的区别是什么?

Perl中标量上下文和列表上下文之间的区别是什么?,perl,list,scalar,Perl,List,Scalar,Perl中的标量上下文和列表上下文有什么区别?在其他语言(如Java或Javascript)中,标量上下文和列表上下文有什么相似之处 这仅仅意味着将根据操作模式评估数据类型。例如,标量赋值意味着右侧将作为标量求值 我认为理解上下文的最好方法是学习wantarray。因此,假设=是一个实现wantarray的子例程: sub = { return if ( ! defined wantarray ); # void: just return (doesn't make sense for =)

Perl中的标量上下文和列表上下文有什么区别?在其他语言(如Java或Javascript)中,标量上下文和列表上下文有什么相似之处

这仅仅意味着将根据操作模式评估数据类型。例如,标量赋值意味着右侧将作为标量求值

我认为理解上下文的最好方法是学习wantarray。因此,假设=是一个实现wantarray的子例程:

sub = {
  return if ( ! defined wantarray ); # void: just return (doesn't make sense for =)
  return @_ if ( wantarray ); # list: return the array
  return $#_ + 1; # scalar: return the count of the @_
}
这些示例的工作方式就像通过将右侧作为参数来调用上述子例程一样


至于其他语言中的相似之处,是的,我仍然认为几乎每种语言都支持相似的东西。多态性在所有OO语言中都是相似的。另一个例子是,Java在某些上下文中将对象转换为字符串。我使用的每种非类型脚本语言都有类似的概念。

Perl中的各种操作符都是上下文敏感的,在列表和标量上下文中产生不同的结果

例如:

my(@array) = (1, 2, 4, 8, 16);
my($first) = @array;
my(@copy1) = @array;
my @copy2  = @array;
my $count  = @array;

print "array: @array\n";
print "first: $first\n";
print "copy1: @copy1\n";
print "copy2: @copy2\n";
print "count: $count\n";
输出:

array: 1 2 4 8 16
first: 1
copy1: 1 2 4 8 16
copy2: 1 2 4 8 16
count: 5
现在:

  • $first
    包含1(数组的第一个元素),因为
    my($first)
    中的括号提供数组上下文,但
    $first
    中只有一个值的空间
  • @copy1
    @copy2
    都包含
    @array
    的副本
  • $count
    包含5,因为它是一个标量上下文,
    @array
    的计算结果是标量上下文中数组中的元素数
还可以构建更详细的示例(结果是读者的练习):


据我所知,在其他语言中,列表和标量上下文没有直接的平行关系。

标量上下文是您在查找单个值时得到的。列表上下文是查找多个值时得到的内容。使用数组时,最常见的区别之一是:

@x = @array;  # copy an array
$x = @array;  # get the number of elements in an array
其他运算符和函数也与上下文相关:

$x   = 'abc' =~ /(\w+)/;  # $x = 1
($x) = 'abc' =~ /(\w+)/;  # $x = 'abc'
@x   = localtime();       # (seconds, minutes, hours...)
$x   = localtime();       # 'Thu Dec 18 10:02:17 2008'
运算符(或函数)在给定上下文中的行为取决于运算符。对于事物的行为,没有一般的规则

通过使用
wantarray
函数来确定调用上下文,您可以使自己的子例程对上下文敏感。您可以使用
scalar
关键字强制在标量上下文中计算表达式


除了标量和列表上下文,您还将看到文档中提到的“void”(预期无返回值)和“boolean”(预期为真/假值)上下文。

谢谢。我喜欢你的例子,除了一个小错误:如果你用1,2,3以外的值填充数组,$copy2的值应该是3以外的其他数字,并且不会与数组本身的大小混淆。一开始我很困惑。但是你解释说。我想如果你把$count改成$copy1,@copy1改成@copy2,$copy2改成$count会更清楚。然后变量名将与内容匹配。变量名还有很多需要改进的地方。我将返工:$count->$first$copy1->$acopy$copy2->$count。问题是关于标量/列表上下文,而不是标量/数组变量。这个概念是Perl独有的。是的,我误解了这个问题。更好。如果可以的话,我会取消投票,但这告诉我它“太旧了”。我喜欢你的“其他运算符”示例,特别是=~运算符在标量和列表上下文中的显著行为。我不会猜到这种行为。是的,在标量上下文中,=~告诉您是否有匹配的内容。在列表上下文中,它返回一个包含捕获文本的列表。
$x   = 'abc' =~ /(\w+)/;  # $x = 1
($x) = 'abc' =~ /(\w+)/;  # $x = 'abc'
@x   = localtime();       # (seconds, minutes, hours...)
$x   = localtime();       # 'Thu Dec 18 10:02:17 2008'