Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex perl中前导空格的匹配和计数_Regex_Perl - Fatal编程技术网

Regex perl中前导空格的匹配和计数

Regex perl中前导空格的匹配和计数,regex,perl,Regex,Perl,我对正则表达式相当陌生,在计算字符串中的空白(仅前导)时遇到了一个小问题。 假设我有一个字符串,看起来像这样: my $str=" for getopts :h opt;; do #this is just a comment"; 现在我只想计算这个字符串中的前导空格/制表符。没有改变原始字符串-只是计数 我试过这样的方法(我知道这很简单): 但不幸的是,这当然只算作该字符串中的第一个空格。 有人有什么想法吗?您可以使用以下代码找出$str if ($str =~ m

我对正则表达式相当陌生,在计算字符串中的空白(仅前导)时遇到了一个小问题。
假设我有一个字符串,看起来像这样:

my $str="        for getopts :h opt;; do       #this is just a comment";
现在我只想计算这个字符串中的前导空格/制表符。没有改变原始字符串-只是计数

我试过这样的方法(我知道这很简单):

但不幸的是,这当然只算作该字符串中的第一个空格。

有人有什么想法吗?

您可以使用以下代码找出
$str

if ($str =~ m/^(\s+)/) {
    $count = length $1;
}

不清楚你的字符串是否正确

'my $str="        for getopts :h opt;; do       #this is just a comment";'
或者只是

'        for getopts :h opt;; do       #this is just a comment'
但我假设是后者。但是,该字符串中没有任何双引号,因此您的正则表达式将失败,因为它需要双引号

我不能让你的陈述做任何有用的事。您是否意识到正则表达式中的
\\s
\\t
表示反斜杠
\
s
t
,而不是空格和制表符的元字符

另一种你可能无法理解的方式是

my $count = () = $str =~ /\G\s/g;
其工作原理是将全局匹配放在列表上下文中,以便逐个找到所有前导空格,然后将该列表放在标量上下文中以返回其长度

然而,最简单和最明显的方法是捕获字符串开头的所有空白,并测量其长度,如下所示

use strict;
use warnings;
use 5.010;

my $str = "        for getopts :h opt;; do       #this is just a comment";

$str =~ /^(\s*)/;
my $count = length($1);

say $count;
输出

8

那个正则表达式并不像你想象的那样。它匹配以下任一项:双引号
后跟换行符,后跟反斜杠
\\
t
,或者换行符/字符串开头后跟反斜杠
\\
,后跟一个或多个
s
,后跟双引号
8