如何读取文件并保存内容,直到遇到perl脚本中的第一个空行

时间:2012-08-17 08:48:46

标签: perl foreach

我正在尝试读取一个文件并保存以$ path开头的行,直到它遇到数组中的第一个balnk行。我有下面的代码,它只打印路径名而不是行。有人可以看看。

Below are the contents of the $file:

\sbd\archieve\date\form
-rwxrwxrwx 1 etd maadm 4354270 Aug 16 21:56 COMAHCUT.dat.20120816.ftpd.201208162156*
-rw-r--r-- 1 etd maadm       0 Aug 16 21:56 COMAHCUT.DONE.20120816.ftpd.201208162156

\sbd\single\archieve\date\form
-rwxr-xr-x 1 etd maadm 1362780 Aug 15 22:02 COMAINS.dat.ftpd.201208152203*
-rwxr-xr-x 1 etd maadm       0 Aug 15 22:02 COMAINS.DONE.ftpd.201208152203*

Below is the code i tried:
#!/usr/bin/perl

my $file = "/home/pauler/practice/DataIt/line.txt";
open (INFO, $file) or die "Cannot open the file $file :$! \n";
my $path = "\sbd\archieve\date\form";

foreach $line (<INFO>) {
        if ($line =~ m/$path/) {
        push (@array1, $line);
        last if ($line =~ m/^$/);
        print @array1;
        }
}

2 个答案:

答案 0 :(得分:1)

触发器操作符..可以挽救生命...我们的代码。它保持为假,直到左边的表达式返回true,并且在右边的表达式变为true之前保持为true ...然后它再次为false,直到左表达式再次计算为true。

# read lines into $_ for cleaner code
while (<INFO>) {
    if (/$path/ .. /^$/) {
       push @array1, $_;
    }
}
print @array1;

哦,关于路径的说明......我知道没有一个真正需要反斜杠的操作系统,甚至不需要Windows ...使用普通斜线/可以避免奇怪的转义序列和潜伏在其中的其他魔法暗

答案 1 :(得分:1)

您可以利用文件句柄记住文件中的位置这一事实。

use strict;
use warnings;

my @array;
my $path = '\sbd\archieve\date\form';

while ( my $line = <DATA> ) {
    next unless $line =~ /\Q$path\E/;
    push @array, $line;
    while ( my $line = <DATA> ) {
        last if $line =~ /^\s*$/;
        push @array, $line;
    }
}

print @array;

__DATA__
\sbd\archieve\date\form
-rwxrwxrwx 1 etd maadm 4354270 Aug 16 21:56 COMAHCUT.dat.20120816.ftpd.201208162156*
-rw-r--r-- 1 etd maadm       0 Aug 16 21:56 COMAHCUT.DONE.20120816.ftpd.201208162156

\sbd\single\archieve\date\form
-rwxr-xr-x 1 etd maadm 1362780 Aug 15 22:02 COMAINS.dat.ftpd.201208152203*
-rwxr-xr-x 1 etd maadm       0 Aug 15 22:02 COMAINS.DONE.ftpd.201208152203*