I have following perl pattern matching condition
(?:\s+\w+){2}
When it's applied on a Linux directory listing
-rw-rw-r-- 1 root root 36547 2011-03-18 18:41 abc.txt
It matches root root
What is ?: doing in this?
I have following perl pattern matching condition
(?:\s+\w+){2}
When it's applied on a Linux directory listing
-rw-rw-r-- 1 root root 36547 2011-03-18 18:41 abc.txt
It matches root root
What is ?: doing in this?
Brackets capture the string found in a regex. ?: will disable the capturing for the current bracket.
"1 root" is matched because the pattern matches two occurrences of one or more whitespace characters (\s) followed by one it more word characters (\w). See "Character Classes and other Special Escapes".
In the example given, the 1st word character that has a whitespace in front is "1", followed by some whitespace and again, one or more word characters.
For those who don't see it - try it out (you can remove the ?: to see the matching group $1, it will contain root):
my $str = '-rw-rw-r-- 1 root root 36574 2011-03-18 18:41 abc.txt';
if ( $str =~ m/(\s+\w+){2}/ ) {
print "matches\n";
print "\$1 contains " . (defined $1 ? $1 : "nothing it's undef") . "\n";
}else{
print "does not match\n";
}