search文件中的特定行

我有一个包含文本文件中的数据的数组。

我想过滤数组并将一些信息复制到另一个数组。 grep似乎不起作用。

这是我的

 $file = 'files.txt'; open (FH, "< $file") or die "Can't open $file for read: $!"; @lines = <FH>; close FH or die "Cannot close $file: $!"; chomp(@lines); foreach $y (@lines){ if ( $y =~ /(?:[^\\]*\\|^)[^\\]*$/g ) { print $1, pos $y, "\n"; } } 

files.txt

 public_html Trainings and Events General Office\Resources General Office\Travel General Office\Office Opperations\Contacts General Office\Office Opperations\Coordinator Operations public_html\Accordion\dependencies\.svn\tmp\prop-base public_html\Accordion\dependencies\.svn\tmp\props public_html\Accordion\dependencies\.svn\tmp\text-base 

正则expression式应该将最后一个或两个文件夹放到自己的数组中进行打印。

正则表达式对此可能会非常挑剔。 将路径分解为多个组件然后根据需要进行计数要容易得多。 还有一个工具可以满足你的确切目的,即核心模块File::Spec ,正如xxfelixxx在评论中提到的那样 。

你可以使用splitdir来分割路径,然后catdir来组成一个。

 use warnings 'all'; use strict; use feature 'say'; use File::Spec::Functions qw(splitdir catdir); my $file = 'files.txt'; open my $fh, '<', $file or die "Can't open $file: $!"; my @dirs; while (<$fh>) { next if /^\s*$/; # skip empty lines chomp; my @all_dir = splitdir $_; push @dirs, (@all_dir >= 2 ? catdir @all_dir[-2,-1] : @all_dir); } close $fh; say for @dirs; 

我使用模块的功能接口,而对于较重的工作,你希望它的面向对象。 将整个文件读入一个数组有它的用途,但一般情况下是逐行处理的。 列表操作可以做得更加优雅,但是为了简单起见。

我想补充一些一般性意见

  • 始终 use strict use warningsuse warnings启动程序

  • 使用词法文件句柄, my $fh而不是FH

  • 意识到(至少)十二个最常用的模块是非常有用的。 例如,在上面的代码中,我们甚至不必提到分隔符\

我无法写出完整的答案,因为我正在使用手机。 无论如何zdim已经主要回答你了。 但是我的解决方案看起来像这样

 use strict; use warnings 'all'; use feature 'say'; use File::Spec::Functions qw/ splitdir catdir /; my $file = 'files.txt'; open my $fh, '<', $file or die qq{Unable to open "$file" for input: $!}; my @results; while ( <$fh> ) { next unless /\S/; chomp; my @path = splitdir($_); shift @path while @path > 2; push @results, catdir @path; } print "$_\n" for @results;