在Perl中有一种方法可以在给定的字符串中获得大量的斜杠,理想情况是在一行中吗?例如,如果字符串为abc\\\
,则返回3
。
我知道如何在多行上执行此操作,但我一直在寻找一种允许我在线进行此操作的解决方案,例如:在if语句条件中。
谢谢!
答案 0 :(得分:5)
在列表上下文中匹配
如果" / g"选项未被使用," m //"在列表上下文中返回一个列表,该列表由模式中括号匹配的子表达式组成,即($ 1,$ 2,$ 3 ...)
我们可以通过(...)[0]
强制列表上下文,它将返回其第一个元素,即$1
。
$string = 'abc\\\\\\';
print "yes\n" if 3 == length(($string =~ /(\\+)$/)[0]);
或,以防止警告
print "yes\n" if 3 == (length(($string =~ /(\\+)$/)[0]) // 0); # 5.10+
但是,如果您知道如何在多行上执行此操作,只需将解决方案包装到do即可完成:
print "yes\n" if 3 == do {
my $count = 0;
my $char = q();
$count++ while '\\' eq ($char = chop $string);
$string .= $char . ('\\' x $count);
$count
};
答案 1 :(得分:4)
use strict;
use warnings;
sub number_trailing_slashes {
my ($string) = @_;
return 0 unless $string;
my ($slashes) = $string =~ m/(\\*)$/;
return length($slashes);
}
# note that to pass a string with three backslashes, you need to escape
# them once in the source string
say number_trailing_slashes("abc\\\\\\"); # 3
答案 2 :(得分:3)
一些解决方案:
$s =~ /(\\*)\z/, length($1) # Use in scalar context.
$s =~ /(\\+)\z/ ? length($1) : 0
length(( $s =~ /(\\*)\z/ )[0])
$s =~ s/^.*[^\\\\]//s, length($s) # Destructive. Use in scalar context.
length( $s =~ s/^.*[^\\\\]//sr ) # Requires Perl 5.14+.
最后两个应该是最快的,因为它们从字符串的结尾开始。