我想删除这些行
John Smith !! NewYork ! 01123 ! 3012-1-315-2164 Alexander Goblin -- WA ------ 9752 - 53-76-132-310 Bittner Albin Cered 3123 26-1-278-127
可以 - !之间的话 我尝试过如下,但它不起作用
while(<FILE>) {
if($_=~m/(\w+\s\w+)((\t) | (\s!+\s) | (\s-+\s))(\w+)((\t) | (\s!+\s) | (\s-+\s)(\d+)((\t) | (\s!+\s) | (\s-
(\d\d-\d\d-\d+-\d+)/){
print $1."\n";
}
}
我认为这是问题:((\t) | (\s!+\s) | (\s-+\s))
答案 0 :(得分:1)
如果要提取前两个单词,可以使用
if (m/(\w+\s+\w+)/) {
print "$1\n";
}
如果要将这些行拆分为其字段,可以使用
my @field = split /\s+!+\s+ | \s+-+\s+ | \t+ /x;
以下是完整示例:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my @record;
while (<DATA>) {
chomp;
if (m/(\w+\s+\w+)/) {
print "$1\n";
}
my @field = split /\s+!+\s+ | \s+-+\s+ | \t+ /x;
push @record, \@field;
}
print Dumper(\@record);
__DATA__
John Smith !! NewYork ! 01123 ! 3012-1-315-2164
Alexander Goblin -- WA ------ 9752 - 53-76-132-310
Bittner Albin Cered 3123 26-1-278-127
注意:上面代码中最后一行的分隔符是\t
,而不是三/四个空格。
上述计划的输出:
$ perl t.pl
John Smith
Alexander Goblin
Bittner Albin
$VAR1 = [
[
'John Smith',
'NewYork',
'01123',
'3012-1-315-2164'
],
[
'Alexander Goblin',
'WA',
'9752',
'53-76-132-310'
],
[
'Bittner Albin',
'Cered',
'3123',
'26-1-278-127'
]
];