为什么我的Perl脚本会从文件中删除字符?
我对Perl脚本有一些问题。它修改文件的内容,然后重新打开以写入文件,在此过程中,某些字符丢失。将从文件中删除以“%”开头的所有单词。这很烦人,因为%表达式是对话框的变量占位符 你知道为什么吗?源文件是具有默认编码的XML 代码如下:为什么我的Perl脚本会从文件中删除字符?,perl,file,Perl,File,我对Perl脚本有一些问题。它修改文件的内容,然后重新打开以写入文件,在此过程中,某些字符丢失。将从文件中删除以“%”开头的所有单词。这很烦人,因为%表达式是对话框的变量占位符 你知道为什么吗?源文件是具有默认编码的XML 代码如下: undef $/; open F, $file or die "cannot open file $file\n"; my $content = <F>;
undef $/;
open F, $file or die "cannot open file $file\n";
my $content = <F>;
close F;
$content =~s{status=["'][\w ]*["']\s*}{}gi;
printf $content;
open F, ">$file" or die "cannot reopen $file\n";
printf F $content;
close F or die "cannot close file $file\n";
这里使用的是printf,它认为它的第一个参数是一个格式字符串。有关详细信息,请参阅。当我遇到此类问题时,我总是确保正确使用函数:
你可能只想:
在您的示例中,您不需要读取整个文件,因为您的替换不会跨行。使用临时文件,而不是一次读取和写入同一文件名:
open my($in), "<", $file or die "cannot open file $file\n";
open my($out), ">", "$file.bak" or die "cannot open file $file.bak\n";
while( <$in> )
{
s{status=["'][\w ]*["']\s*}{}gi;
print $out;
}
rename "$file.bak", $file or die "Could not rename file\n";
这里使用的是printf,它认为它的第一个参数是一个格式字符串。有关详细信息,请参阅。当我遇到此类问题时,我总是确保正确使用函数:
你可能只想:
在您的示例中,您不需要读取整个文件,因为您的替换不会跨行。使用临时文件,而不是一次读取和写入同一文件名:
open my($in), "<", $file or die "cannot open file $file\n";
open my($out), ">", "$file.bak" or die "cannot open file $file.bak\n";
while( <$in> )
{
s{status=["'][\w ]*["']\s*}{}gi;
print $out;
}
rename "$file.bak", $file or die "Could not rename file\n";
呃。您正在使用printf printf将%解释为特殊的内容 改用打印 如果必须使用printf,请使用
printf "%s", $content;
重要提示:
PrintF代表打印格式,就像在C中一样
fprintf是文件IO在C中的等效值
Perl不是C
即使在C语言中,将内容作为参数1也会因为安全原因而遭到攻击 Er。您正在使用printf printf将%解释为特殊的内容 改用打印 如果必须使用printf,请使用
printf "%s", $content;
重要提示:
PrintF代表打印格式,就像在C中一样
fprintf是文件IO在C中的等效值
Perl不是C
即使在C语言中,将内容作为参数1也会因为安全原因而遭到攻击 甚至
perl -i bak -pe 's{status=["\'][\w ]*["\']\s*}{}gi;' yourfiles
-e说有下面的代码供你运行
-Ibak说将旧文件重命名为which.bak
-p在-e代码周围添加了一个read-print循环
Perl一行程序是一个强大的工具,可以为您节省大量的苦工。甚至
perl -i bak -pe 's{status=["\'][\w ]*["\']\s*}{}gi;' yourfiles
-e说有下面的代码供你运行
-Ibak说将旧文件重命名为which.bak
-p在-e代码周围添加了一个read-print循环
Perl one Liner是一个功能强大的工具,可以为您节省大量的繁琐工作。如果您想要一个了解文档XML特性的解决方案,即只删除状态属性,而不匹配文本内容,您也可以使用:
如果您想要了解文档的XML性质的解决方案,即只删除状态属性,而不匹配文本内容,您还可以使用:
这是因为您使用了printf而不是print,并且您知道printf不会打印%,因为它会认为您忘记键入格式符号,例如%s、%f等,除非您明确地以%%表示:- 这是因为您使用了printf而不是print,并且您知道printf不会打印%,因为它会认为您忘记键入格式符号,例如%s、%f等,除非您以%%明确提及:- 不,-i bak说把旧文件重命名为whateverbak。不管.bak是什么-i.bakno,-i bak说将旧文件重命名为whateverbak。不管怎样,巴克会是-我,巴克