2011-03-07 28 views
0

這裏是一個字符串Perl的字符串格式化

[移動] [來源] [目標]

現在我想移動 「移動」, 「源」, 「目標」 到變量。

這是我的代碼提前

#Try grab the "move" part. 
    $data = "[ Move ] [ Source ] [ Destination ]" 
    $start = index($data, '[') + 2; 
    $end = index($data, ']') - 2; #The +- 2 is to get rid of the spaces 
    $cmd = substr $data, $start, $end; #This does not work. No idea why. 
    $data = substr $data, $end; 
    $start = index($data, '[') + 2; 
    $end = index($data, ']') - 2; 
    $source = substr $data, $start, $end; 
    $data = substr $data, $end; 
    $start = index($data, '[') + 2; 
    $end = index($data, ']') - 2; 
    $destination = substr $data, $start, $end; 

感謝。

+1

要了解原因,請參見[substr'函數的文檔](http://search.cpan.org/~rjbs/perl-5.12.3/pod/perlfunc.pod#substr) – mob 2011-03-07 15:40:50

+1

爲了更好的方法,請查看[正則表達式](http://search.cpan.org/perldoc?perlretut)。 – mob 2011-03-07 15:42:12

+0

正在閱讀文檔,但找不到有用的東西。 此外,我與正則表達式鬥爭。 – Krayons 2011-03-07 15:50:27

回答

4

也許是這樣的:

my $input = '[ Move ] [ Source ] [ Destination ]'; 
my ($mov, $src, $dst) = $input =~ /\[ \s* (.*?) \s* \]/gx; 
print "$mov $src $dst\n"; 
+0

像魔術一樣工作。 謝謝。 – Krayons 2011-03-07 16:01:17

0

有許多的方法,你可以做到這一點。

  1. 拆分字符串] [並從字段中刪除多餘的括號,例如。

    my @strings = 
        map { s/^[|]$//; $_ } 
        split '] [', $input; 
    
  2. 或者使用正則表達式來提取用方括號括起來的字符串的每一位。

    my @strings = ($input =~ m{\[\s*(.*?)\s*\]}g); 
    

然而,這些方法可以掉下來,如果你有嵌套方括號。

0

首先,你有沒有這樣做的原因,而不是使用正則表達式來捕獲有趣的數據?

my ($cmd, $source, $destination) = $data =~ /^\[ ([^]]*) \]\[ ([^]]*) \]\[ ([^]]*) \]$/` 

至於爲什麼你發佈的代碼不工作,你說的不實際工作線工作得很好 - $cmd越來越文本「移動」只是因爲它應該。但是,從$data刪除「移動」後,看看你有什麼:「e] [來源] [目的地]」下次您設置$start,這工作正常,但設置$end找到第一]在字符串中,所以$source從位置6到位置0得到substr;因爲範圍在開始之前結束,所以這是一個空字符串。設置$destination有同樣的問題,所以也是空的。

當試圖調試問題時,總是檢查您的變量以驗證它們是否保留了您認爲它們的值。在這種情況下,他們通常不是。

1

許多方法在Perl中做到這一點。一種是使用正則表達式:

if ($data =~ /^\[([^\]]+)\]\s*\[([^\]]+)\]\s*\[([^\]]+)\]/) { 
    my $command = $1; 
    my $source = $2; 
    my $destination = $3; 
} 
else { 
    die "Didn't match\n"; 
} 

這有點難看。基本上\[\]匹配你的方括號。你必須在它們前加一個反斜槓,因爲在正則表達式中括號是神奇的[^\]]與非右括號相匹配。 [^x]意味着除x之外的任何內容。末尾的加號至少意味着一個。因此[^\]]+匹配儘可能多的字符,直到它到達另一個右括號。表達式周圍的曲線括號將其保存在$1,$2$3變量中。我爲每個匹配的項目重複這一點。

有一種循環遍歷正則表達式的方法來繼續找到匹配的部分,但這比現在想要的更復雜一點。

另一種是使用分割命令:

$data =~ s/^\[(.*)\]$/$1/; 
my ($move, $source, $destination) = split (/\]\s*\[/, $data); 

第一行去除前綴和附加括號,然後我分裂的「] [」括號中。再次,我使用正則表達式。

正則表達式是Perl的生命之血,你應該儘可能地瞭解它們。 Perl使用標準的Unix正則表達式,並將它們擴展了很多。您可以輸入perldoc perlre來查找有關正則表達式及其使用方式的文檔,但更多的是參考手冊而不是教程。您也可以嘗試perldoc perlrequick這是更多的教程。