如何在perl中找到连字符

时间:2014-02-27 07:32:27

标签: perl file-handling hyphen

extraction.txt包含类似

的数据
S MADHAVA RAO
DIRECTOR (OPERATIONS)
B R B NMPL
NOTE MUDRAN  NAGAR
MYSORE -570003
M RAVI KUMAR
ATRIUM 4TH FLOOR  10/19
7TH CROSS STREET
SASTRINAGAR
CHENNAI  -600020
PHNO-24469079
VENKATA SIVA PRASAD
B-301 VERTEX PRESTIGE
NIZAMPET ROAD
NEAR BRINDAVAN  COLONY
KUKATPALLY
HYDERABAD -500085
.................
.................
.................

从下面写的这个为-5提取值。

open(my$f,'<', "/home/Admin/Desktop/extracting.txt") or die "oops!";
open(my$fh,'>', "/home/Admin/Desktop/finalextracting.txt") or die "oops!";
while (my@line = <$f>) {
    for (my$i = 0;$i<=145;$i++){
    if ($line[$i]=~m/^\-5/) {
        print $fh $line[$i];
    }
}
}
close $f;
close $fh;

但是我的程序没有显示任何输出。代码有什么问题请纠正我..

4 个答案:

答案 0 :(得分:3)

那是因为你在正则表达式的开头有一个^,它只会在行的开头匹配。

此外,您无需转义-

答案 1 :(得分:3)

首先,不要将整个文件粘贴到@line数组中,其次不要使用硬编码大小的数组(145)。至于匹配要小心,因为有些字符有特殊的行为。 ^是字符串开头的锚点,并且您没有以-5开头的行

while (my $line = <$f>) {
  if ($line =~ /(-5\d+)/) {
      print $fh $1;
  }
}

答案 2 :(得分:2)

有些事情看起来可能是错的:

1)插入符号^匹配一行的开头,上面显示的所有行都不以-5开头,删除它以搜索该行中的任何位置

2)你不需要转义减号,所以以下内容将匹配-5行中的任何位置:

if ($line[$i]=~/-5/) 

3)我相信匹配运算符m //只搜索$ _所以尝试并删除它(我从不使用m,因为如果你只是做“if / -5 /”就暗示了,所以我可能错了。)

if ($line[$i]=~/^\-5/)

希望这会有所帮助

答案 3 :(得分:1)

如果我理解正确你想要做的只是打印行中-5后的所有内容,而不是整行?

在那种情况下

while (my$line = <$f>) {
    if ($line =~ /(-5.*)$/) {
        print $fh $1;
    }
}

可能就是你想要的。