Regex perl:引用foreach循环中的组

Regex perl:引用foreach循环中的组,regex,perl,loops,foreach,Regex,Perl,Loops,Foreach,我可以引用foreach循环中的组吗?我的代码如下: @SEP_line=grep(/,\s(SEP[A-F0-9]*),\s(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}),\s(\+\d+),\s.*,\s(\w+)\n$/, @lines); foreach (@SEP_line) { /,\s(SEP[A-F0-9]*),\s(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}),\s(\+\d+),\s.*,\s(\w+)\n$/;

我可以引用foreach循环中的组吗?我的代码如下:

@SEP_line=grep(/,\s(SEP[A-F0-9]*),\s(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}),\s(\+\d+),\s.*,\s(\w+)\n$/, @lines);

foreach (@SEP_line)
{
    /,\s(SEP[A-F0-9]*),\s(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}),\s(\+\d+),\s.*,\s(\w+)\n$/;

    print $1.",".$2.",".$3.",".$4."\n";
}
因为我已经在@SEP_行定义中指定了匹配正则表达式,所以我会这样做:

@SEP_line=grep(/,\s(SEP[A-F0-9]*),\s(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}),\s(\+\d+),\s.*,\s(\w+)\n$/, @lines);

foreach (@SEP_line)
{
    print @SEP_line[$1].",".@SEP_line[$2].",".@SEP_line[$3]."\n";
}
这不管用。提前感谢

为什么循环两次(
grep
foreach
)?您可以在一个循环中完成这一切:

foreach my $line (@lines)
{
    if ($line =~ /,\s(SEP[A-F0-9]*),\s(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}),\s(\+\d+),\s.*,\s(\w+)\n$/)
    {
        print "$1,$2,$3,$4\n";
    }
}
为什么循环两次(
grep
foreach
)?您可以在一个循环中完成这一切:

foreach my $line (@lines)
{
    if ($line =~ /,\s(SEP[A-F0-9]*),\s(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}),\s(\+\d+),\s.*,\s(\w+)\n$/)
    {
        print "$1,$2,$3,$4\n";
    }
}

不要手工解析和手工生成CSV!使用CSV解析器更简单、更干净

use Text::CSV_XS qw( );

my $fh_in  = ...;
my $fh_out = \*STDOUT;

my $csv_in  = Text::CSV_XS->new({ binary => 1, auto_diag => 2, sep => ', ' });
my $csv_out = Text::CSV_XS->new({ binary => 1, auto_diag => 2 });

while ( my $row = $csv_in->getline($fh_in) ) {
    $csv_out->say($fh_out, [ @$row[-4,-3,-2,-1] ]
       if $row->[-4] =~ /^SEP[A-F0-9]*\z/
       && $row->[-3] =~ /^\d{1,3}(?:\.\d{1,3}){3}\z/
       && $row->[-2] =~ /^\+\d+\z/
       && $row->[-1] =~ /^\w+\z/;
}

不要手工解析和手工生成CSV!使用CSV解析器更简单、更干净

use Text::CSV_XS qw( );

my $fh_in  = ...;
my $fh_out = \*STDOUT;

my $csv_in  = Text::CSV_XS->new({ binary => 1, auto_diag => 2, sep => ', ' });
my $csv_out = Text::CSV_XS->new({ binary => 1, auto_diag => 2 });

while ( my $row = $csv_in->getline($fh_in) ) {
    $csv_out->say($fh_out, [ @$row[-4,-3,-2,-1] ]
       if $row->[-4] =~ /^SEP[A-F0-9]*\z/
       && $row->[-3] =~ /^\d{1,3}(?:\.\d{1,3}){3}\z/
       && $row->[-2] =~ /^\+\d+\z/
       && $row->[-1] =~ /^\w+\z/;
}

如果发现有很多捕获变量,可以使用和散列来访问它们。如果要保存捕获供以后使用,甚至可以复制该哈希。如果发现有很多捕获变量,可以使用和哈希来访问它们。如果要保存捕获供以后使用,甚至可以复制该哈希。