2014-11-06 57 views
0

我試圖從文件中打印每一行,如果它們包含特定位置中的單個字符,則以'+'開始,但我將使用' - 」。該代碼運行,但沒有提供輸出,我相信這是一個非常簡單的錯誤,因爲我檢查了正則表達式,它的工作原理!匹配特定字符,如果找到則打印

FILE1數據:

3628 -a 
9712 +T 
11004 -a 
11379 -a 
12715 +T 
14184 +T 

輸出:

9712 +T 
12715 +T 
14184 +T 

代碼:

#!/usr/bin/perl 

use strict; 
use warnings; 
use autodie; 

my $outputfile = "/Users/edwardtickle/Documents/indelfinal.txt"; 

open FILE1, "/Users/edwardtickle/Documents/indelcount.txt"; 

open (OUTPUTFILE, ">$outputfile"); 

while (<FILE1>) { 
    if (/^(\d+)\s+(\S)(\S)/) { 
    if ($2 =~ m/'+'/) { 
    print OUTPUTFILE "$1 $2$3\n"; 
    } 
} 
} 

close FILE1; 
close OUTPUTFILE; 

乾杯!

回答

4
if ($2 =~ m/'+'/) { 

這是一個正則表達式匹配,所以它沒有做你認爲它做的事。如果$2+-或其他)包含至少有兩個撇號的序列($2的長度總是1,所以這絕不會發生),這將匹配。

你想要一個字符串比較,而不是:

if ($2 eq '+') { 
+0

太棒了,感謝您的快速解決方案! – 2014-11-06 17:48:36

1

下面的正則表達式可以幫助你在一個字符串在倒數第二(特定)位置determin +

m/\+.$/ 

例如

#!/usr/bin/perl 

use strict; 
use warnings; 
use autodie; 


open FILE1, "input"; 


while (<FILE1>) { 
    if ($_ =~ m/\+.$/) { 
    print "$_"; 
    } 
} 

close FILE1; 

將產生輸出爲

9712 +T 
12715 +T 
14184 +T 

它做什麼?

  • \+匹配+

  • .匹配任何單個字符

  • $字符串的末尾匹配。

0

它看起來像有永遠只能是在你輸入一個+或一個-,所以有在分割線進入字段,你做測試前沒有任何意義。這是你需要的。

while (<FILE1>) { 
    print OUTPUTFILE $_ if /\+/; 
} 

,或者在一個單行命令

perl -ne'print if /\+/' indelcount.txt > indelfinal.txt 

注意,後者需要你當前的工作目錄是/Users/edwardtickle/Documents

0

它給你所期望的

use warnings; use strict; 
open('new',"file1"); 
my @ar = <new>; 
my @vz = grep{m/\+/g} @ar; 
print @vz,"\n"; 

我使用grep運算符來匹配特定的單詞文件中的句子。

相關問題