gpt4 book ai didi

perl - 在@_ 中使用对元素的引用来避免重复代码

转载 作者:行者123 更新时间:2023-12-04 10:24:25 26 4
gpt4 key购买 nike

引用 @_ 的元素是否安全在子程序中以避免重复代码?我也想知道以下是否是好的做法或可以简化。我有一个子程序 mod_str这需要一个选项,说明是否应就地修改字符串参数:

use feature qw(say);
use strict;
use warnings;

my $str = 'abc';

my $mstr = mod_str( $str, in_place => 0 );
say $mstr;
mod_str( $str, in_place => 1 );
say $str;

sub mod_str {
my %opt;
%opt = @_[1..$#_];

if ( $opt{in_place} ) {
$_[0] =~ s/a/A/g;
# .. do more stuff with $_[0]
return;
}
else {
my $str = $_[0];
$str =~ s/a/A/g;
# .. do more stuff with $str
return $str;
}
}

为了避免重复/复制 if 中的代码和 else以上块,我试图改进 mod_str :
sub mod_str {
my %opt;
%opt = @_[1..$#_];

my $ref;
my $str;
if ( $opt{in_place} ) {
$ref = \$_[0];
}
else {
$str = $_[0]; # make copy
$ref = \$str;
}
$$ref =~ s/a/A/g;
# .. do more stuff with $$ref
$opt{in_place} ? return : return $$ref;
}

最佳答案

“就地”标志将函数的界面更改为应该是新函数的位置。它将简化界面、测试、文档和内部结构,使其具有两个功能。用户不必解析参数并拥有一个很大的 if/else 块,而是已经为您做出了选择。

另一种看待它的方式是 in_place选项将始终设置为常量。因为它从根本上改变了函数的行为方式,所以写 in_place => $flag 是不明智的。 .

一旦你这样做了,重用就会变得更加明显。编写一个函数来就地执行操作。写另一个在副本上调用它。

sub mod_str_in_place {
# ...Do work on $_[0]...

return;
}

sub mod_str {
my $str = $_[0]; # string is copied

mod_str_in_place($str);

return $str;
}

关于perl - 在@_ 中使用对元素的引用来避免重复代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31898495/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com