Perl 可选变量匹配?

Perl 可选变量匹配?,perl,Perl,我想编写一个正则表达式,可以提取以下字符串中的2、3或4个字符: a b a b c a b c d 为此,我编写了以下代码: #!/usr/bin/perl use strict; use warnings; my @a = ("a b", "a b c", "a b c d"); while (defined (my $line = shift @a)) { my ($c1, $c2, $c3, $c4) = ""; ($c1, $c2, $c3) = $line

我想编写一个正则表达式,可以提取以下字符串中的2、3或4个字符:

a b
a b c
a b c d
为此,我编写了以下代码:

#!/usr/bin/perl

use strict;
use warnings;

my @a = ("a b", "a b c", "a b c d");

while (defined (my $line = shift @a)) {

    my ($c1, $c2, $c3, $c4) = "";
    ($c1, $c2, $c3) = $line =~ /^(.*?)\s(.*?)\s(.*?)?.*?/;
    print "$c1, $c2, $c3\n";
}
但是,上述操作失败,因为在前两个字符串中找不到$c3。如何使$c3和$c4成为可选的,以便在没有任何匹配项时正则表达式不会失败?

在这种情况下,正则表达式比正则表达式更实用

for my $line (@a) {

    my ($c1, $c2, $c3, $c4) = split " ", $line;
    print "$c1, $c2, $c3\n";
}
在这种情况下,它比正则表达式更实用

for my $line (@a) {

    my ($c1, $c2, $c3, $c4) = split " ", $line;
    print "$c1, $c2, $c3\n";
}
如何使$c3和$c4成为可选的,以便在没有任何匹配项时正则表达式不会失败

除非你必须使用个人变量,考虑使用数组来保存你想要的字符:

use strict;
use warnings;

my @a = ( "a b", "a b c", "a b c d" );

for my $line (@a) {
    my @chars = split ' ', $line;
    #my @chars = $line =~ /\S+/g; # Or use this regex to capture the chars
    print join( ', ', @chars ), "\n";
}
输出:

a, b
a, b, c
a, b, c, d
希望这有帮助

我如何使$c3和$c4成为可选的,以便在没有任何匹配项时正则表达式不会失败

除非你必须使用个人变量,考虑使用数组来保存你想要的字符:

use strict;
use warnings;

my @a = ( "a b", "a b c", "a b c d" );

for my $line (@a) {
    my @chars = split ' ', $line;
    #my @chars = $line =~ /\S+/g; # Or use this regex to capture the chars
    print join( ', ', @chars ), "\n";
}
输出:

a, b
a, b, c
a, b, c, d

希望这有帮助

要解释字符串中的任意数量的字段,我建议您使用数组而不是标量变量列表

在任何情况下,如果您有像$f1、$f2、$f3、$f4这样的变量,那么这表明您可能需要一个数组@f。然后可以使用$f[0]、$f[1]、$f[2]、$f[3]

像这样

use strict;
use warnings;

my @data = ('a b', 'a b c', 'a b c d');

for (@data) {
  my @fields = split;
  print join(', ', @fields), "\n";
}
输出


为了解释字符串中任意数量的字段,我建议您使用数组而不是标量变量列表

在任何情况下,如果您有像$f1、$f2、$f3、$f4这样的变量,那么这表明您可能需要一个数组@f。然后可以使用$f[0]、$f[1]、$f[2]、$f[3]

像这样

use strict;
use warnings;

my @data = ('a b', 'a b c', 'a b c d');

for (@data) {
  my @fields = split;
  print join(', ', @fields), "\n";
}
输出


使用split,您得到了一些很好的答案。但是你也可以用正则表达式很容易地做到这一点。你只需要从稍微不同的方向攻击它

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

my @strings = ("a b", "a b c", "a b c d");

foreach (@strings) {
  my @matches = /(\S+)/g;
  say "@matches";
}

使用split,您得到了一些很好的答案。但是你也可以用正则表达式很容易地做到这一点。你只需要从稍微不同的方向攻击它

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

my @strings = ("a b", "a b c", "a b c d");

foreach (@strings) {
  my @matches = /(\S+)/g;
  say "@matches";
}

非常漂亮的解决方案。如何避免在串联中使用未初始化的值$c3。还是绳子?非常漂亮的解决方案。如何避免在串联中使用未初始化的值$c3。还是字符串?print+是否表示?:为每个数组元素添加换行符?@JasmineLognnes-它消除了语句的歧义,因此print知道如何处理它。重做该行以避免使用前导+。print+是否意味着?:为每个数组元素追加换行符?@JasmineLognnes-它消除了语句的歧义,因此print知道如何处理它。重做该行以避免使用前导+。