Perl: return 来自子例程的数组
Perl: return an array from subroutine
Perl 新手。
我无法理解 return 从模块中的子程序中获取数组值。
脚本有以下内容:
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";
该模块包括以下子程序:
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';
所以它似乎能发挥这么大的作用。但是,脚本中 $fullname
的 return 值显示全部小写:
testing this
为什么不将 Dumper 显示的更正后的大写变量作为最后一次数组迭代?
您没有将 return 分配给任何东西。此外,子操作 @_
它不应该这样做,如下所述。也可以大大简化
sub check_name {
my ($class, $name) = @_;
if ($name =~ /^\w+\s+\w+$/) {
return join ' ', map { ucfirst lc } split ' ', $name;
}
return; # returns "undef" (as input wasn't in expected format)
}
那么调用者可以做
my $fullname = Jhusbands::Loginpass->check_name($name);
print "$fullname\n" if $fullname;
应始终检查子程序的 return,但在这种情况下更是如此,因为它有条件地处理其输入。为了清楚起见,我将输入重命名为 sub($name
)。
如果 sub 中的代码是为了通过直接写入 @_
来更改 $fullname
(而您因此没有 return),那会失败,因为在特定操作 $_[0]
不再是传递的参数的别名。
在任何情况下,这样做都非常棘手,可能导致代码不透明——而且是不必要的。要直接更改参数,请将其作为引用传递并写入。但是,在这种情况下 return 结果可能更清晰,更不容易出错。
需要注意的是,上面的名字 "processing" 遇到了处理名字的标准问题,因为它们令人眼花缭乱。如果这需要全面,那么应该将名称解析分派到可以处理可能的麻烦的圆形库(或过程)。
感谢 ikegami 通过示例以及更直接的方式提出的意见:
$name =~ s/(\w+)/\u\L/g;
return $name;
与v5.14引入的/r
可以写成
return $name =~ s/(\w+)/\u\L/gr;
如果 $name
没有单词字符 (\w
) 并且没有匹配此 return 相同的字符串。
Perl 新手。
我无法理解 return 从模块中的子程序中获取数组值。
脚本有以下内容:
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";
该模块包括以下子程序:
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';
所以它似乎能发挥这么大的作用。但是,脚本中 $fullname
的 return 值显示全部小写:
testing this
为什么不将 Dumper 显示的更正后的大写变量作为最后一次数组迭代?
您没有将 return 分配给任何东西。此外,子操作 @_
它不应该这样做,如下所述。也可以大大简化
sub check_name {
my ($class, $name) = @_;
if ($name =~ /^\w+\s+\w+$/) {
return join ' ', map { ucfirst lc } split ' ', $name;
}
return; # returns "undef" (as input wasn't in expected format)
}
那么调用者可以做
my $fullname = Jhusbands::Loginpass->check_name($name);
print "$fullname\n" if $fullname;
应始终检查子程序的 return,但在这种情况下更是如此,因为它有条件地处理其输入。为了清楚起见,我将输入重命名为 sub($name
)。
如果 sub 中的代码是为了通过直接写入 @_
来更改 $fullname
(而您因此没有 return),那会失败,因为在特定操作 $_[0]
不再是传递的参数的别名。
在任何情况下,这样做都非常棘手,可能导致代码不透明——而且是不必要的。要直接更改参数,请将其作为引用传递并写入。但是,在这种情况下 return 结果可能更清晰,更不容易出错。
需要注意的是,上面的名字 "processing" 遇到了处理名字的标准问题,因为它们令人眼花缭乱。如果这需要全面,那么应该将名称解析分派到可以处理可能的麻烦的圆形库(或过程)。
感谢 ikegami 通过示例以及更直接的方式提出的意见:
$name =~ s/(\w+)/\u\L/g;
return $name;
与v5.14引入的/r
可以写成
return $name =~ s/(\w+)/\u\L/gr;
如果 $name
没有单词字符 (\w
) 并且没有匹配此 return 相同的字符串。