我有一个带有多个 XML 标记的文件,例如:
<Good>Yay!</Good>
<Great>Yup!</Great>
<Bad>booo</Bad>
<Bad>
<Ok>not that great</ok>
</Bad>
<Good>Wheee!</Good>
我想摆脱“坏”标签以及介于两者之间的任何东西。所以它会变成:
<Good>Yay!</Good>
<Great>Yup!</Great>
<Good>Wheee!</Good>
我知道这个单行:
perl -pe "undef $/;s/<Bad>.*?<\/Bad>//msg" < originalFile > newlyStrippedFile
似乎可以做我想做的一切(除了添加额外的换行符,但希望我可以很容易地处理)
但是我需要把它放在一个脚本中(两个文件被读入命令行,一个带有所有标签,另一个带有要拉出的标签列表),所以同一件事将被多次调用。
而我只是遇到了麻烦。要么它只读取一行,要么我得到错误或两者兼而有之。
这是我最近尝试的相关部分:
open ORIGINAL_FILE, $sdb_pathname
or die "Can't open '$sdb_pathname' : $!";
@sdb_input_array = <ORIGINAL_FILE>;
close ORIGINAL_FILE;
@sdb_input_scalar=join("",@sdb_input_array);
foreach $tag (@tags) {
&remove_tag($tag);
}
sub remove_tag
{
my($current_tag) = @_;
$sdb_input_scalar =~ s/<$current_tag>.*?<\/$current_tag>//msg;
open NEWLY_STRIPPED_FILE, $clean_sdb_pathname
or die "Can't open '$clean_sdb_pathname' : $!";
print(NEWLY_STRIPPED_FILE $sdb_input_scalar);
close(NEWLY_STRIPPED_FILE);
}
这给了我“在我的 $sdb_input_scalar =~ 行中使用未初始化的值 $sdb_input_scalar 代替 (s///)。并且文件句柄 NEWLY_STRIPPED_FILE 仅用于输入
当然,我的两个文件看起来仍然相同,就好像我对它们什么都没做一样。
如果我遗漏了一些明显的东西,我很抱歉,但我对 perl 来说是全新的。有人在工作中给出了 8 小时的估计来完成这个脚本,而我已经用了 5 多个小时来安装 perl,学习语法并让其他方面顺利进行。我知道有一个 XML::Parser 模块,但我发现这些示例在我剩下的很短的时间内非常难以完成。
我必须假设我的正则表达式是正确的,因为单线工作得很好。任何人都可以帮我调整它以适应我的需要吗?