2016-02-02 17 views
0

所以即時通訊試圖學習如何在Perl中使用正則表達式。我有一個textfile.txt包含信息,我想訪問該文本文件的特定部分。該TextFile.txt的包含以下項(第3行):Perl - 在文本文件上使用正則表達式來獲取數組中的特定字符串輸入

Jan 2016-01-01 Friday 12:00 
Feb 2016-02-01 Monday 23:45 
Mar 2016-03-01 Tuesday 15:30 

我想要做的就是把這個月的名稱「一月/二月/三月」在一個陣列,它們的數值「2016 -01-01「在第二個數組中。我當前的腳本將整個第一行放在同一個元素中。這是我到目前爲止寫入陣列碼:

while (<FILE>) { 
push (@newArray, $_); 
} 
close FILE 

如何將我去只是把日期的條目(2016年1月1日)或每月的名稱(一月/二月/三月)從文件中放入數組,而不是將整行放入數組元素中?

+2

是否必須是'regex'?因爲'split'可以很好地工作。 – Sobrique

+2

「所以我試圖學習如何在Perl中使用正則表達式。」學習正則表達式的最重要的事情之一是何時使用它,以及何時使用另一種工具更合適。在這種情況下,我同意Sobrique的說法,'split'會更好。 – ThisSuitIsBlackNot

+2

正則表達式不是每個問題的解決方案。事實上,使用正則表達式後,您可能會發現[n + 1問題](https://xkcd.com/1171/)。 ;-) –

回答

3

我不會用一個regex而是分裂:

#!/usr/bin/perl 

use warnings; 
use strict; 

use Data::Dumper; 

my @month_words; 
my @month_dates; 
my %month_lookup; 

while (<DATA>) { 
    my ($mon, $date, $day, $time) = split; 
    push (@month_words, $mon); 
    push (@month_dates, $date); 
    $month_lookup{$mon} = $date; 
} 

print Dumper \@month_words, \@month_dates, \%month_lookup; 

__DATA__ 
Jan 2016-01-01 Friday 12:00 
Feb 2016-02-01 Monday 23:45 
Mar 2016-03-01 Tuesday 15:30 

將打印出兩個數組,和哈希:

$VAR1 = [ 
      'Jan', 
      'Feb', 
      'Mar' 
     ]; 
$VAR2 = [ 
      '2016-01-01', 
      '2016-02-01', 
      '2016-03-01' 
     ]; 
$VAR3 = { 
      'Mar' => '2016-03-01', 
      'Feb' => '2016-02-01', 
      'Jan' => '2016-01-01' 
     }; 
+0

因此,在這種情況下分割只是將整條線「分割」爲單個的片斷/單詞?我認爲這種方法將成爲每條線具有相同格式的路線?並且當文本文件中的每行都不是相同的格式時,我應該使用正則表達式? – NinjaAnte

+0

@NinjaAnte'split'在你有定期的分隔數據(逗號,製表符,分號等)時很好,這就是你在這裏看到的。當字段可以包含分隔符時(例如,一個CSV字段可以包含逗號或一個固定寬度的格式,其中的字段由空格分隔,但也可以包含空格),或者數據未被分隔時,它不起作用。 – ThisSuitIsBlackNot

+0

'split'採用分隔符,並將字符串轉換爲基於此的數組。分隔符可以是一個正則表達式(「默認」是任何空格,這通常是有用的)。如果您需要驗證(或放棄)該行,或使用可變字段分隔符,則正則表達式很好。 (例如,「星期一4 00:23:22」的日期)。 – Sobrique

0

創建捕捉組()從匹配的正則表達式中提取信息:

#!/usr/bin/perl 
use warnings; 
use strict; 

my (@months, @dates); 
while (<DATA>) { 
    if (my ($month, $date) = /^(...) \s+ ([0-9-]+)/x) { 
     push @months, $month; 
     push @dates, $date; 
    } 
} 
print "@months\[email protected]\n"; 

__DATA__ 
Jan 2016-01-01 Friday 12:00 
Feb 2016-02-01 Monday 23:45 
Mar 2016-03-01 Tuesday 15:30 

如果你想只接受月份名稱,就可以在第一組改變從(...)(A(?:pr|ug)|Dec|Feb|J(?:an|u[ln])|Ma[ry]|Nov|Oct|Sep)

+0

簡單地分割空白不是更簡潔嗎? '我的($ month,$ date,$ weekday,$ time)= split(/ \ s + /,$ _);' –

+0

OP請求正則表達式解決方案。 – Sobrique

相關問題