Perl:从子例程.pm返回一个数组

时间:2017-06-19 18:01:25

标签: perl return-value subroutine data-dumper

Perl noob。

我无法理解从.pm文件中的子程序返回数组值。

.pl文件包含以下内容:

print "Enter your first and last name.\n";
    chomp(my $fullname = <STDIN>); #input is 'testing this' all lower case

Jhusbands::Loginpass->check_name($fullname);

print "$fullname\n";

.pm包括以下子程序:

sub check_name {
    my $class = shift;
    if ($_[0] =~ /^\w+\s+\w+$/ ) {
        @_ = split( / /, $_[0]);

            foreach $_ (@_) {
                $_ = ucfirst lc for @_;
                @_ = join(" ", @_);
                print Dumper(@_) . "\n";
                return @_;
            }
      }   
}

我正在取名字,只检查它的第一个和最后一个(我以后会得到else语句),拆分它,纠正大小写,再加入.Dumper将最终数组显示为:

                  $VAR1 = 'Testing This';

所以它似乎工作到目前为止。但是,.pl文件中$ fullname的返回值显示全小写:

                    testing this 

为什么不将Dumper显示的更正大写变量作为最后一次数组迭代?

1 个答案:

答案 0 :(得分:3)

您不会将回报分配给任何东西。此外,该子操纵它不应该做的@_,除非有很好的直接推荐。它也可以简化

sub check_name {
    my ($class, $name) = @_;

    if ($name =~ /^\w+\s+\w+$/) {
        return join ' ', map { ucfirst lc } split ' ', $name;
    }

    return;
}

来电者

my $fullname = Jhusbands::Loginpass->check_name($name);

print "$fullname\n" if $fullname;

应始终检查子返回,但在这种情况下更是如此,因为它有条件地处理其输入。

请注意,为了清楚起见,我将输入重命名为sub(到$name)。如果您希望保留相同的名称,则应删除返回值的声明。

如果sub中的代码是通过直接写入$fullname来更改@_(并且由于该原因而没有返回),那么在特定操作之后失败{{1}不再对传递的参数设置别名。

无论如何,这样做非常棘手且不必要。要直接更改参数,请将其作为引用传递给它并写入。但是,它可能更清晰,更不容易返回结果。

应该注意上面的名称&#34;处理&#34;由于其令人眼花缭乱的变化而遇到了名称处理的标准问题。如果这需要全面,那么应该将名称解析分派到可以处理可能的直接性的舍入库(或过程)。

感谢ikegami提出的评论,以及更直接的方式:

$_[0]
在v5.14中引入$name =~ s/(\w+)/\u\L$1/g; return $name;

可以写成

/r

如果return $name =~ s/(\w+)/\u\L$1/gr; 没有单词字符($name)并且没有匹配,则返回相同的字符串。