2011-11-18 65 views
0

,如果我有兩個不同的字符串,如:的perl怎麼做線對齊在Perl

my $a = "garfieldaagt"; 
my $b = "field"; 

,我需要調整它們像

garfieldaagt 
    field 

對它們進行比較,我怎麼能做到這一點?

任何想法?由於

+3

如果家庭作業增加'家庭作業'標記。 – nponeccop

+0

是你的問題如何正確對齊文本或如何對齊匹配的兩個單詞的特定部分?例如。如果它是'加菲爾德'vs'場',而不是。 – TLP

+2

如果'$ b'不是'$ a'的子字符串,你希望看到什麼?即如果'$ b =「lkjfb」'。 – n0rd

回答

0

你可以使用printf來打印這些字符串與alignement:

printf "%8s\n%8s", $a, $b; 

這裏的8號指定多少個字符用於如果需要打印字符串,包括空格。

+0

這回答了一些其他問題,而不是在這裏問的問題:-) – tadmc

+0

你是指問題的最後一種形式?由OP重新編輯?也許... – 2011-11-18 13:27:18

2

如果您想直觀比較,請參閱其他答案。如果您想以編程方式進行比較,可以選擇幾個選項。

  1. 您可以在字符串中使用負指數並按字符比較。
  2. 您可以使用substr並用一個子比較小串較大的一個
  3. 你可以用積極的指標,但在較大的字符串添加長度差到index

最後,如果你想墊字符串與空格的長度相同,則可以使用與printf相同的方式使用sprintf

第二個選項是確實是一個程序員可以在生產代碼中寫:

my $x = "foobar"; 
my $y = "bar"; 

if ($y eq substr $x, -length($y)) 
{ 
    print "$y is a suffix of $x\n"; 
} 

正則表達式或一個完整的子字符串搜索是矯枉過正這裏。

+0

我喜歡你的第二個選項,你可以舉一個例子 – user1051414

+0

我加了個例子。我希望這不是你的家庭作業,因爲在這裏不提供對作業的完整答案。 – nponeccop

+0

哦,我提供了你最初的加菲爾德vs場的問題的答案。在garfieldjdkfdjf vs garfield的更一般的設置中,你應該使用'index'函數。 – nponeccop

6

您可以使用index函數來搜索字符串,然後使用x repetition operator將您的子字符串與它在更長字符串中找到的位置對齊。

$a = "garfield"; 
$b = "field"; 
print $a,"\n"; 
print " " x index($a,$b) ,$b,"\n"; 
0

這看起來像一個X-Y問題。我認爲這個問題更多的是確定字符串B是否包含字符串A.

雖然substr/index組合是很有誘惑力的使用,正則表達式更好地適合這個需求裏面:

my $stringA = 'garfieldaagt'; 
my $stringB = 'field'; 

print "'$stringB' contained in '$stringA'\n" if $stringA =~ /$stringB/; 
# 'field' contained in 'garfieldaagt' 

使用正則表達式還將解決更復雜的需求,如不區分大小寫的匹配。

查看perldoc perlrequick快速介紹。

+0

也許這應該是'/ \ Q $ stringB \ E /' – TLP

+0

如果substr/index可以用'lc'輕鬆實現,則不區分大小寫的匹配。 '索引'方法很難編寫和維護,但速度更快,因此具體取決於。 – nponeccop

+0

對於ci匹配,'lc'在某些Unicode情況下無法正常工作。 – squadette

0

動態規劃是做到這一點,你會得到:

加菲貓

Garied

加菲貓

明嘉-IE-d

這是一個路線。任何其他的東西都可以是前綴搜索,子串搜索或者你擁有的東西。

它完成比較Garfield x Garied以矩陣的形式並找到從第一個字母匹配到最後一個的最長和更便宜的路徑,懲罰差距。

如果你不太常見的字母分數較高,對齊可能會更好。但在自然語言(英語,西班牙語)的情況下不是必需的。

Regards

+3

不明白這是如何回答這個問題的? – kleopatra