Tcllibのstruct::list
パッケージには、ツールの重要な部分である最長共通部分列を計算するためのツールがあります。使用するには、データを Tcl にロードし、それを行のリストに分割します。diff
proc getLines {filename} {
set f [open $filename]
set result [split [read $f] "\n"]
close $f
return $result
}
次に、共通要素 (== 共通行) に関する情報を取得できます。
set sharedLineInfo [struct::list longestCommonSubsequence $file1_lines $file2_lines]
これは、リストのペアを返します。各リストは、共通行のインデックス (ゼロから数えます) です。最初のリストは最初のファイル用で、2 番目のリストは 2 番目のファイル用です。リストされていない行番号は、変更された行番号になります。
あるシーケンスを別のシーケンスに変更する方法についての指示を取得するために提供される情報を反転する機能もあります。
set changes [struct::list lcsInvert $sharedLineInfo \
[llength $file1_lines] [llength $file2_lines]]
これはトリプルのリストを返します。最初は実行された操作 ( added
、changed
またはdeleted
) で、2 番目と 3 番目は関連する各リストのインデックスの範囲 (つまり、0 から始まる行番号) です。
この情報をどのように取得して、探しているものを生成するかはよくわかりませんが、次のようにまとめることができると思います。
package require struct::list
proc getLines {filename} {
set f [open $filename]
set result [split [read $f] "\n"]
close $f
return $result
}
proc variedLines {filename1 filename2} {
set l1 [getLines $filename1]
set l2 [getLines $filename2]
lassign [struct::list longestCommonSubsequence $l1 $l2] common1
set result {}
for {set i 0} {$i < [llength $l1]} {incr i} {
if {$i ni $common1} {
lappend result [expr {$i + 1}]
}
}
return $result
}
結果をファイルに書き込みたい場合は、puts $f [join $someList "\n"]
機能する可能性が高いですが、それは演習として残しておきます…</p>