【问题标题】:Perl signatures: Can Lists be substituted by Scalars?Perl 签名:可以用标量替换列表吗?
【发布时间】:2014-01-18 00:36:00
【问题描述】:

看一下perl的打印子程序之一:

print FILEHANDLE LIST

(http://perldoc.perl.org/functions/print.html)

我试过了,似乎你也可以传递一个标量而不是一个列表。这是 perl 中的一般规则,即无论何时需要列表,您都可以传入一个标量?那么标量会自动转成列表吗?

提前谢谢你。

【问题讨论】:

  • 只有一个元素的列表仍然是列表。

标签: perl list scalar


【解决方案1】:

LIST 指的是返回零个或多个标量列表的表达式。它与EXPR 基本相同,只是暗示它是在列表上下文中调用的。

print($fh ());         # "()" is a placeholder that avoids the default to $_
print($fh $foo);
print($fh $foo, $bar);
print($fh @array);
print($fh map uc, @a);

没有列表数据结构。这只是一个概念和隐喻。

【讨论】:

    【解决方案2】:

    您只能将标量列表传递给 perl 中的某个函数。

    这是 perl 中的一般规则,即无论何时需要列表,您都可以传入一个标量?

    是的,在这种情况下,您只有一个元素长列表。

    print()($one, $two, $three) 作为列表,其方式与@arrmap $_, @arr$arr[0], $arr[1], $arr[2] 相同

    【讨论】:

    • “您只能将标量列表传递给 perl 中的某个函数。”,您指的是仅内置子例程,对吗?我的意思是可以定义一个函数,它最终是否采用标量?
    • @user2820379 你能解释一下这个函数的样子吗?
    • 没关系。我只是对 perl 中的例程做了一些研究。看来我脑子里有一个错误的概念。谢谢你的回答。
    • 关于“你指的只是内置子程序对吗?”,不。原型可能会让你看起来可以传递其他东西,但即使是它们,也只有标量被传递给子程序。
    【解决方案3】:

    在子例程中,Perl 假定您使用参数列表调用子例程。

    这就是为什么,如果你的子程序被调用

    my_subroutine ($a, $b, $c);
    

    在子程序中,你可以这样做

    sub my_subroutine
    {
        my $x = shift;
        my $y = shift;
        my $z = shift;
    ...
        #Or, my ($x, $y, $z) = @_;
    

    通过调用 shift,您在 @_ 上隐式调用 shift,@_ 是传入参数的数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-22
      • 1970-01-01
      • 2013-06-19
      • 1970-01-01
      • 2020-11-02
      • 2012-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多