在Perl中转换为子例程

在Perl中转换为子例程,perl,subroutine,Perl,Subroutine,我有一段代码,在本例中使用给定列表提取名称: 我想把这段代码转换成一个子程序,我尝试了不同的方法,但它不能满足我的需要。另一个问题是,如何将所有结果(在本例中为Barney Bruse,Wilma Flinstone)添加到@match数组中,而不使用foreach(@match){push(@extract,$) 注: 此代码包括一个sub(根据要求) 这种方法要快得多 这种方法解决了重复的问题。(例如,它不会像代码那样将William Bates添加到@matches中两次。) 这种方法是

我有一段代码,在本例中使用给定列表提取名称:

我想把这段代码转换成一个子程序,我尝试了不同的方法,但它不能满足我的需要。另一个问题是,如何将所有结果(在本例中为Barney Bruse,Wilma Flinstone)添加到@match数组中,而不使用
foreach(@match){push(@extract,$)

注:

  • 此代码包括一个sub(根据要求)
  • 这种方法要快得多
  • 这种方法解决了重复的问题。(例如,它不会像代码那样将
    William Bates
    添加到
    @matches
    中两次。)
  • 这种方法是稳定的。(输出与输入的顺序相同。)
  • 这段代码使用了更合理的变量名

如何在不使用foreach(@match){push(@extract,$)的情况下将所有结果添加到@match数组中

相当于

push @extract, @match;
注:

  • 此代码包括一个sub(根据要求)
  • 这种方法要快得多
  • 这种方法解决了重复的问题。(例如,它不会像代码那样将
    William Bates
    添加到
    @matches
    中两次。)
  • 这种方法是稳定的。(输出与输入的顺序相同。)
  • 这段代码使用了更合理的变量名

如何在不使用foreach(@match){push(@extract,$)的情况下将所有结果添加到@match数组中

相当于

push @extract, @match;
注:

  • 此代码将代码移动到子代码中(根据请求)
  • 这种方法解决了重复的问题。(例如,它不会像代码那样将
    William Bates
    添加到
    @matches
    中两次。)
  • 这种方法是稳定的。(输出与输入的顺序相同。)
注:

  • 此代码将代码移动到子代码中(根据请求)
  • 这种方法解决了重复的问题。(例如,它不会像代码那样将
    William Bates
    添加到
    @matches
    中两次。)
  • 这种方法是稳定的。(输出与输入的顺序相同。)

您可以使用将
grep
'd数据推入
extract
。您也可以使用
push@extract、@match;
。看起来您是在做一个学习Perl的练习。这是一个很好的资源。:)但不要在shebang上使用
-w
。使用
使用警告
pragma。对于子程序部分对于您的问题,您需要告诉我们哪些数据是词汇数据(因此仅在中可用)子例程和始终相同,哪些数据作为参数输入,以及子例程内外是否有任何可用的内容。有一百万种方法可以做到这一点,但我们不知道您想做什么。您可以使用将
grep
'd数据推送到
extract
。您可以简单地使用
push@extract,@match、 
也一样,显式的
@match
是多余的:
push@extract,grep/$unit/,@array1;
在一行中完成所需的操作。这里不需要
chomp
,您可以使用
foreach my$unit(@list){push@extract,grep/$unit/,@arrary1;}从
@list
中命名值
。你能给我们展示一个失败的子程序尝试,让我们看看哪个部分比较难吗?你可以用它将
grep
'd数据推送到
extract
。你也可以简单地使用
push@extract,@match;
。看起来你在做一个学习Perl的练习。这是一个很好的资源。:)不要在shebang上使用
-w
尽管如此。请使用
使用警告
杂注。对于问题的子例程部分,您需要告诉我们哪些数据是词法数据(因此仅在子例程和始终相同,哪些数据作为参数输入,以及子例程内外是否有任何可用的内容。有一百万种方法可以做到这一点,但我们不知道您想做什么。您可以使用将
grep
'd数据推送到
extract
。您可以简单地使用
push@extract,@match、 
也一样,显式的
@match
是多余的:
push@extract,grep/$unit/,@array1;
在一行中完成所需的操作。这里不需要
chomp
,您可以使用
foreach my$unit(@list){push@extract,grep/$unit/,@arrary1;}从
@list
中命名值
。您能否向我们展示一个失败的子程序尝试,以便我们了解哪个部分比较困难?
foreach (@match) { push (@extract, $_); }
push @extract, @match;
use strict;
use warnings;

sub multi_grep {
    my $checks = shift;
    my %seen;
    for my $check (@$checks) {
        ++$seen{$_} for grep $check, @_;
    }

    # This ensures we don't remove duplicates.
    # It also happens to make this approach stable.
    return grep $seen{$_}, @_;
}

my @array1 = ( "Fred Flinstone", "Wilma Flinstone", "Barney Rubble", "Betty Rubble" );
my @list = ( "Ba", "Wil" );  # Expected to be regex patterns.

my @matches = multi_grep(\@list, @array1);