2013-03-20 100 views
0

我有一個足夠簡單的問題,我想最近我運行了一個腳本,它從數組中的每個元素的字符串中提取特定信息。我已經寫過,並且它的功能很好,但是現在嘗試使用它的非常簡單的版本時,它不會只展示相同的響應未初始化值參數的數據!我之前的代碼工作讓我非常沮喪。我清楚地做了一些愚蠢的事情,並會喜歡一些幫助!

#!/usr/bin/env perl 

use strict; 
use warnings; 


[email protected]; 
my$line; 
my$idea; 
my$file="demo_site.txt"; 

open(IN, "<$file")||die"\ncannot be opend\n"; 

@histone=<IN>; 
print @histone; 

foreach $line(@histone) 
     { 
      $line=~ m/([a-zA-Z0-9]+)\t[0-9]+\t[0-9]+\t/; 

      print$1."\n"; 
      print$2."\n"; 
      print$3."\n"; 

     } 

「demo_site.txt」需要一個選項卡的格式的infile分隔.txt文件:

chr9  1234  5678  .  200  .  14.0  -1 

此文件具有多行如上和我希望提取前三項數據的所以輸出如下所示。

chr9 
1234 
5678 

乾杯!

回答

1

假設,即file.txt有你想要什麼:(file.txt eq demo_site.txt

chr9  1234  5678  .  200  .  14.0  -1 

你可以用簡單的事情:在Perl

perl -ane '$" = "\n"; print "@F[0..2]"' file.txt 1>output.txt 

一行程序是強大的。而你並不需要編寫簡單的任務腳本;)

只需打開終端有時;)

PS:

這不是很好的一行,我知道,但它做它必須做什麼。

+0

這真的接近我需要的輸出!誰在乎它看起來像什麼時候它做的工作,我想;) – Jcrow06 2013-03-20 14:34:47

+0

我明白,我的代碼是相當嚴格的,但我真的很驚訝,這不起作用,因爲我有另一個腳本,這工作沒有問題,我昨天寫的所有問題並且甚至現在運行...爲什麼它不適用於更簡單的直接代碼是超越我的! – Jcrow06 2013-03-20 14:36:16

+0

不止這些!我想,如果我用單線做一些討厭的工作(有時候一線球員比斯基德球員更簡單),我需要打開另一個腳本並輸入一行'qx()' – gaussblurinc 2013-03-20 14:37:00

3

你不需要正則表達式,因爲它是製表符分隔的。

foreach $line(@histone) 
     { 
      @line_data = split(/\t/,$line) 

      print $line_data[0]."\n"; 
      print $line_data[1]."\n"; 
      print $line_data[2]."\n"; 

     } 

編輯:
如果你想要將其值分配給特定命名變量,在一個臨時數組分配給它。

($varA, $varB, $varC ....) = split(/\t/,$line) 
+0

這是真的,但爲了進一步的使用我希望能夠將每個數據點分配給一個變量,作爲後面的代碼的輸入。 – Jcrow06 2013-03-20 14:20:18

+0

我添加了一個例子,展示瞭如何使用split來做到這一點。 – 2013-03-20 14:24:15

0

$線=〜米/([A-ZA-Z0-9] +)\噸[0-9] + \噸[0-9] + \噸/)所有的

首先,這些人的身體不平衡。

其次,我沒有檢查過這個,但是你不需要爲每次捕獲設置一組parens嗎?

第三,因爲錯位,我說split()絕對是要走的路。 ;)

+0

抱歉,對我來說,這樣的代碼搞亂了我留在最後的「)」在最後,不應該在那裏 – Jcrow06 2013-03-20 14:38:03

+0

好吧,我已經看到你的所有建議都非常好,所以非常感謝你! – Jcrow06 2013-03-20 14:54:33

0

如果我可以自我推銷,您可以使用Tie::Array::CSV作爲arrayrefs的Perl數組直接讀寫訪問文件。

use strict; 
use warnings; 
use Tie::Array::CSV; 
tie my @file, 'Tie::Array::CSV', 'demo_site.txt', sep_char => "\t"; 

print $file[0][0]; # first line before first tab 
$file[2][1] = 10; # set the third line between the first and second tabs 
2

這裏的實際問題是,你想打印的$1$2$3值,但你只有一套在你的正則表達式捕獲括號的,所以只有$1得到的值。 $2$3將保持未定義狀態,因此在嘗試打印時會出現此錯誤。

解決方案是添加兩組捕獲括號。我希望你想這樣的事情:

$line=~ m/([a-zA-Z0-9]+)\t([0-9]+)\t([0-9]+)\t/; 
+0

+1我剛剛補充說,作爲一個編輯我的,你忍者我! – 2013-03-20 14:56:28