2011-08-18 25 views
2

我有一個看起來輸入文件一樣使用Perl來創建另一個Perl的文件

*firsttitle 
nameA 
nameB 
nameC 
*secondtitle 
xnameA 
xnameB 
xnameC 

我想創建一個Perl腳本,需要該文件,並基本上將創建另一個Perl腳本看起來像

#!/usr/bin/perl 

     use strict; 
     use warnings; 

     my %tags = (
      "firsttitle" => [ qw (nameA nameB nameC) ], 
      "secondtitle" => [ qw (xnameA xnameB xnameC) ]); 

my $rx = join '|', keys %tags; 

while (<>) { 
    s/^\s*($rx):\s*(\d+)/$1: $tags{$1}[$2]/; 
    print; 
} 

我的思考過程是,我必須先打印出普通的perl代碼(#!,use..etc。),然後添加「my%tags =(。然後取出輸入文件並尋找*這就是哈希的查找,並開始解析t之後的所有內容他接下來的(*)或生命的結束。如果它是另一個*,那麼再做一次。如果是EOF則添加「);」並結束。然後完成打印perl代碼的最後一位。幫助/想法將不勝感激。如果你打算髮布代碼片段你能否通過並解釋每個部分正在做什麼?謝謝!

+0

這聽起來或許是一個好主意,但我甚至不知道從哪裏開始。你能給我一個關於在哪裏尋找教程的建議 –

回答

1

非常簡單的腳本。首先解析輸入文件。以*開頭的行將是標題,並且直到下一個* -line的所有以下行將是值。我們把它放到數組的散列中。

map聲明給我們一個散列鍵(標題)的列表,它的值與空間連接在一起。我們把它放在一個數組中進行打印。打印本身是用printf完成的,這可能有點難以使用,因爲元字符會讓我們陷入困境。任何%必須是文字必須寫爲%%。我也將原來的單引號改爲雙引號。我在printf模式上使用單引號以避免意外插入變量。

另一種方法 - 可能更好 - 不僅僅是printf,而是以正常方式簡單地串接字符串。

use strict; 
use warnings; 

my ($title, %hash); 
while (<DATA>) { 
    chomp; 
    if (/^\*(.+)$/) { 
     $title = $1; 
    } else { 
     push @{$hash{$title}}, $_; 
    } 
} 

my @args = (map { $_, join(' ', @{$hash{$_}}) } keys %hash); 
printf '#!/usr/bin/perl 

use strict; 
use warnings; 

my %%tags = (
     "%s" => [ qw (%s) ], 
     "%s" => [ qw (%s) ]); 

my $rx = join "|", keys %%tags; 

while (<>) { 
    s/^\s*($rx):\s*(\d+)/$1: $tags{$1}[$2]/; 
    print; 
}', @args; 

__DATA__ 
*firsttitle 
nameA 
nameB 
nameC 
*secondtitle 
xnameA 
xnameB 
xnameC 

更新:

這將使用打印的不同方法,這將是更穩定的。

my @args = (map { " '$_' => [ qw (@{$hash{$_}}) ],\n" } keys %hash); 
print '#!/usr/bin/perl 

use strict; 
use warnings; 

my %tags = (
', @args, ' 
); 

my $rx = join "|", keys %tags; 

while (<>) { 
    s/^\s*($rx):\s*(\d+)/$1: $tags{$1}[$2]/; 
    print; 
}'; 
+0

我不斷收到這個錯誤:printf中的無效轉換:./script2.pl第17行<>第90行中的「%t」。當我給它一個大輸入文件。請注意,我將()更改爲(<>)。請注意,第90行是我輸入文件中的最後一行。該方案輸出的前兩個「標題」,但沒有更多。 –

+0

哦,那是'%tags' ..應該是'%% tags'。奇怪的是,當我測試它時它工作。 – TLP

+0

更新回答,打印方式不使用'printf' – TLP