在 Perl 中,如何将变量作为参数传递给子程序?

杰森丈夫

我将一个标量变量传递给我想测试参数是否与正则表达式匹配的子程序:

use strict;
use warnings;

use Data::Dumper;

print "Please enter your first name followed by your last name. For example: John Smith.\n";

chomp(my $name = <STDIN>);

&analyze_name($name);

sub analyze_name {
    if ($_ =~ /^\w+\s+\w+$/) {
            print "You entered $_.";
                    } else {
            print "Incorrect convention";
    }
}

我得到以下错误的输出

Please enter your first name followed by your last name. For example: John Smith.
firstname lastname
Incorrect convention
Use of uninitialized value $_ in pattern match (m//) at /home/jhusbands/scripts/examples/test.pl line 13, <STDIN> line 1.

我的想法是它会传递$name给“魔法变量” $_我需要在多个<STDIN>变量上重用这个子程序如何初始化$_

津巴布克

子程序的参数不在$_. 它在数组中@_,您需要将其取出。

sub analyze_name {
    my $name = shift; # implicitly shifts @_
    if ($name =~ m/.../) { ... }
}

或者作为列表分配

sub analyze_name {
    my ($name) = @_;
    ....
}

或者,如果你想@_直接数组进行操作

sub analyze_name {
    if ($_[0] =~ m/.../) { ... }
}

现在我们正在访问数组中的第一个元素@_Perl 中变量名前面的符号(称为sigil)随着该表达式返回的值的类型而变化。所以对于数组它是@_,但是当你访问一个元素时,它变成了$_[0]因为里面的值是标量,这意味着它只有一个值。这不同于$_,后者是一个标量变量。同样的事情也适用于@array,$array[4]和标量变量$array(这是一个错误选择的名称)。

在大多数情况下,您想要执行shift或 列表分配。如果您有两个或三个参数,则列表通常更易于阅读。如果有很多 args,每行一个是有意义的。@_直接操作通常只有在速度有问题时才有意义,因为您的 sub 在您的程序中被调用了数百万次。我的建议是采用简洁易读的代码并使用正确命名的参数


$name在上面的代码是词法到该子程序。这意味着它只存在于那里,每次你调用那个 sub 时,你都会得到一个新的$name. 调用时传入的变量的变量名无关紧要。

analyze_name($foo);
analyze_name($bar);
analyze_name('foobar');

所有这些都将一个值传递给 sub。sub 不关心变量名。在 sub 中,它总是$name. 子之外,$name不存在。


请注意,您不应&在 Perl 中使用 with 调用 subs 大约 20 年前,这曾经是 Perl 4 中的语法。在 Perl 5 中,这&foo()具有您可能不想要的特殊含义。如果您想了解更多信息,请删除&, 并查找子程序原型

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将变量传递给子程序以在 perl 中发送电子邮件

来自分类Dev

Perl子程序参数

来自分类Dev

如何将stdin传递到将输入作为唯一参数的perl脚本中?

来自分类Dev

如何将stdin传递到将输入作为唯一参数的perl脚本中?

来自分类Dev

如何将一个函数作为参数传递给Perl中的另一个函数,然后调用它?

来自分类Dev

Perl:修改作为参数传递给子例程的变量

来自分类Dev

修改子程序参数(Perl)

来自分类Dev

Perl:如何将日期作为Perl脚本的参数

来自分类Dev

使用bash变量将参数传递给perl

来自分类Dev

Perl:如何将ARGV参数传递给另一个脚本?

来自分类Dev

如何将强制和可选命令行参数都传递给perl脚本?

来自分类Dev

尝试更改行时如何将参数传递给perl?

来自分类Dev

如何将变量和文件都传递给perl -p -e命令

来自分类Dev

将@ARGS作为速记传递给Perl中的foreach(@ARGS)

来自分类Dev

Perl:如何将打开命令的输出传递给文件

来自分类Dev

如何将数组从Perl传递给Expect脚本?

来自分类Dev

如何从PERL将参数传递给Powershell并保留输出?

来自分类Dev

通过Perl中的fucntions参数将值传递给查询

来自分类Dev

将数组和变量传递给Perl中的函数

来自分类Dev

将多个 Perl 变量传递给 R

来自分类Dev

将 Perl 变量传递给 Javascript 函数

来自分类Dev

保持子程序响应并在 Perl 中设置为变量

来自分类Dev

Perl:将数组作为参数传递

来自分类Dev

Perl如何在我的子程序中利用块参数(就像grep一样)

来自分类Dev

Perl子程序参数,例如哈希

来自分类Dev

在Windows的cmd.exe Shell中,如何将Perl脚本的输出传递给Python脚本?

来自分类Dev

如何将哈希表中可变数量的数组传递给List :: Compare perl模块?

来自分类Dev

如何在Perl中覆盖子程序,例如`length`?

来自分类Dev

子程序中的perl foreach循环

Related 相关文章

  1. 1

    如何将变量传递给子程序以在 perl 中发送电子邮件

  2. 2

    Perl子程序参数

  3. 3

    如何将stdin传递到将输入作为唯一参数的perl脚本中?

  4. 4

    如何将stdin传递到将输入作为唯一参数的perl脚本中?

  5. 5

    如何将一个函数作为参数传递给Perl中的另一个函数,然后调用它?

  6. 6

    Perl:修改作为参数传递给子例程的变量

  7. 7

    修改子程序参数(Perl)

  8. 8

    Perl:如何将日期作为Perl脚本的参数

  9. 9

    使用bash变量将参数传递给perl

  10. 10

    Perl:如何将ARGV参数传递给另一个脚本?

  11. 11

    如何将强制和可选命令行参数都传递给perl脚本?

  12. 12

    尝试更改行时如何将参数传递给perl?

  13. 13

    如何将变量和文件都传递给perl -p -e命令

  14. 14

    将@ARGS作为速记传递给Perl中的foreach(@ARGS)

  15. 15

    Perl:如何将打开命令的输出传递给文件

  16. 16

    如何将数组从Perl传递给Expect脚本?

  17. 17

    如何从PERL将参数传递给Powershell并保留输出?

  18. 18

    通过Perl中的fucntions参数将值传递给查询

  19. 19

    将数组和变量传递给Perl中的函数

  20. 20

    将多个 Perl 变量传递给 R

  21. 21

    将 Perl 变量传递给 Javascript 函数

  22. 22

    保持子程序响应并在 Perl 中设置为变量

  23. 23

    Perl:将数组作为参数传递

  24. 24

    Perl如何在我的子程序中利用块参数(就像grep一样)

  25. 25

    Perl子程序参数,例如哈希

  26. 26

    在Windows的cmd.exe Shell中,如何将Perl脚本的输出传递给Python脚本?

  27. 27

    如何将哈希表中可变数量的数组传递给List :: Compare perl模块?

  28. 28

    如何在Perl中覆盖子程序,例如`length`?

  29. 29

    子程序中的perl foreach循环

热门标签

归档