use strict;
my $str = 'total 80
drwxr-xr-x 2 root root 4096 Sep 23 15:20 bin
drwxr-xr-x 3 root root 4096 Sep 3 18:41 boot
drwxr-xr-x 3 root root 4096 Aug 19 20:48 build
drwxr-xr-x 14 root root 3900 Sep 23 15:20 dev
drwxr-xr-x 98 root root 4096 Sep 23 15:20 etc
drwxr-xr-x 4 root root 4096 Oct 6 2014 home
drwxr-xr-x 21 root root 4096 Aug 21 19:49 lib
drwxr-xr-x 2 root root 4096 Jul 8 13:21 lib64
drwx------ 2 root root 16384 Aug 26 2014 lost+found
drwxr-xr-x 2 root root 4096 Aug 26 2014 media
drwxr-xr-x 2 root root 4096 Apr 10 2014 mnt
drwxr-xr-x 2 root root 4096 Aug 26 2014 opt
dr-xr-xr-x 133 root root 0 Sep 23 15:20 proc
drwx------ 4 root root 4096 Sep 23 15:27 root
drwxr-xr-x 22 root root 760 Sep 23 17:40 run
drwxr-xr-x 2 root root 12288 Sep 23 15:20 sbin
drwxr-xr-x 2 root root 4096 Aug 26 2014 srv
dr-xr-xr-x 13 root root 0 Sep 23 15:20 sys
drwxrwxrwt 2 root root 4096 Sep 23 17:40 tmp
drwxr-xr-x 10 root root 4096 Aug 26 2014 usr
drwxr-xr-x 14 root root 4096 Aug 21 19:52 var
';
my $regex = qr/(?<type>.{1})(?<user_access>.{3})(?<group_access>.{3})(?<other_access>.{3}) +(?<oder>[0-9]*) +(?<owner>[a-z]*) +(?<group>[a-z]*) +(?<size>\d*) +(?<month>[a-z]{3}) +(?<day>\d{1,2}) +(?<year>\d{0,4})(?<time>(?<hour>\d{2}):(?<minute>\d{2}))? +(?<filename>(?<basename>.+)\.(?<extension>.*)|(?<no_extension_filename>.*))/mip;
if ( $str =~ /$regex/g ) {
print "Whole match is ${^MATCH} and its start/end positions can be obtained via \$-[0] and \$+[0]\n";
# print "Capture Group 1 is $1 and its start/end positions can be obtained via \$-[1] and \$+[1]\n";
# print "Capture Group 2 is $2 ... and so on\n";
}
# ${^POSTMATCH} and ${^PREMATCH} are also available with the use of '/p'
# Named capture groups can be called via $+{name}
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Perl, please visit: http://perldoc.perl.org/perlre.html