ファイルを正しくPerl
インデントするための次のスクリプトがあります。XML
@files = glob "*.xml";
undef $/;
for $file (@files) {
$indent = 0;
open FILE, $file or die "Couldn't open $file for reading: $!";
$_ = readline *FILE;
close FILE or die "Couldn't close $file: $!";
# Remove whitespace between > and < if that is the only thing separating them
s/(?<=>)\s+(?=<)//g;
# Indent
s{ # Capture a tag <$1$2$3>,
# a potential closing slash $1
# the contents $2
# a potential closing slash $3
<(/?)([^/>]+)(/?)>
# Optional white space
\s*
# Optional tag.
# $4 contains either undef, "<" or "</"
(?=(</?))?
}
{
# Adjust the indentation level.
# $3: A <foo/> tag. No alteration to indentation.
# $1: A closing </foo> tag. Drop one indentation level
# else: An opening <foo> tag. Increase one indentation level
$indent +=
$3 ? 0 :
$1 ? -1 :
1;
# Put the captured tag back into place
"<$1$2$3>" .
# Two closing tags in a row. Add a newline and indent the next line
($1 and defined($4) and ($4 eq "</") ? "\n" . (" " x $indent) :
$4 ? "\n" . (" " x $indent) :
""
)
# /g repeat as necessary
# /e Execute the block of perl code to create replacement text
# /x Allow whitespace and comments in the regex
}gex;
open FILE, ">", $file or die "Couldn't open $file for writing: $!";
print FILE or die "Couldn't write to $file: $!";
close FILE or die "Couldn't close $file: $!";
}
まず、 mytabs
をインデントしていて、 2 つの空白が必要でした。また、次の行ではなく、同じインデントで同じ行にあるように、同じインデントでタグを生成しています。
<?xml version="1.0" encoding="iso-8859-1"?><!DOCTYPE kit SYSTEM "tc.dtd"><kit><contact/><description>
あるべき場所:
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE kit SYSTEM "tc.dtd">
<kit>
<contact/>
<description>
...
XML
などのindent する Perl ツールがあることは認めますが、タグXML-Tidy
が原因で、依存関係自体ではなく、同じファイルのインデント (書式設定) だけを気にしているのにtc.dtd
、ファイルの解決できない依存関係について不平を言うエラーが常に発生します。tc.dtd
私のPerl
正規表現の何が問題になっていますか?