我编写了一个Perl程序,它从文本文件中读取文本并打印出来。
我想打印出具有特定格式的行。
例如,有一些这样的行:
information:
Ahmad.prn:592118:2001:7:5:/Essay
Ashford.rtf:903615:2001:6:28:/usr/Essay
Barger.doc:243200:2001:7:4:/home/dir
end of Information.
我想只读这三行:
Ahmad.prn:592118:2001:7:5:/Essay
Ashford.rtf:903615:2001:6:28:/usr/Essay
Barger.doc:243200:2001:7:4:/home/dir
我认为字段的含义是:
Ahmad.prn <- file name
592118 <- size of file
2001:7:5 <- created date
/Essay <- path of file
我的代码是:
#!/usr/bin/perl
use strict;
use warnings;
open (my $infh, "<", $file)||die "cant open";
while(my $line = <$infh>) {
chomp ($line);
if ($line =~ /(what regular expression do I have to put in here?)/) {
print "$line";
}
}
close ($infh);
答案 0 :(得分:3)
如果你需要的行总是以/ Essay结尾,你可以使用以下正则表达式
/:\/Essay$/
编辑1 :看起来中间部分只是数字,你可以这样匹配。
/:\d+:\d+:\d+:\d+:/
答案 1 :(得分:0)
$line =~ m{
^
(\w+\.\w+) # filename stored as $1
:
(\d+) # size stored as $2
:
(\d{4}) # year stored as $3
:
(\d+) # month stored as $4
:
(\d+) # day stored as $5
:
(.*) # path stored as $6
$
}x
答案 2 :(得分:0)
因为你有这种格式的Ahmad.prn:592118:2001:7:5:/ Essay
Ahmad.prn <- file name
592118 <- size of file
2001:7:5 <- created date
/Essay <- path of file
你可以使用这个正则表达式
/^\s*(\S+):(\d+):(\d+:\d+:\d+):(\S+)\s*$/
有了这个,你的文件名为1美元,文件大小为2美元,创建日期为3美元,文件路径为4美元
我在行的开头和结尾添加了可选空格,如果你想在之后或之前允许可选空格:你可以添加\ s *
答案 3 :(得分:0)
#!/usr/bin/perl
use strict;
my $inputText = qq{
Ahmad.prn:592118:2001:7:5:/Essay
Ashford.rtf:903615:2001:6:28:/usr/Essay
Barger.doc:243200:2001:7:4:/home/dir
end of Information.
};
my @input = split /\n/, $inputText;
my $i = 0;
while ($input[$i] !~ /^end of Information.$/) {
if ($input[$i] !~ /:/) {
$i++;
next;
}
my ($fileName, $fileSize, $year, $month, $day, $filePath) = split /:/, $input[$i];
print "$fileName\t $fileSize\t $month/$day/$year\t $filePath\n";
$i++;
}
答案 4 :(得分:0)
$line =~ ([a-zA-Z.]+):(\d+):(\d+):(\d+):(\d+):([\/A-Za-z]+)
$name = $1; #Ahmad.prn
$id = $2; #592118
$year = $3; #2001
$dir = $6; #/Essay
注意:循环使用多个名称