Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的Perl脚本会从文件中删除字符?_Perl_File - Fatal编程技术网

为什么我的Perl脚本会从文件中删除字符?

为什么我的Perl脚本会从文件中删除字符?,perl,file,Perl,File,我对Perl脚本有一些问题。它修改文件的内容,然后重新打开以写入文件,在此过程中,某些字符丢失。将从文件中删除以“%”开头的所有单词。这很烦人,因为%表达式是对话框的变量占位符 你知道为什么吗?源文件是具有默认编码的XML 代码如下: undef $/; open F, $file or die "cannot open file $file\n"; my $content = <F>;

我对Perl脚本有一些问题。它修改文件的内容,然后重新打开以写入文件,在此过程中,某些字符丢失。将从文件中删除以“%”开头的所有单词。这很烦人,因为%表达式是对话框的变量占位符

你知道为什么吗?源文件是具有默认编码的XML

代码如下:

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。不管怎样,巴克会是-我,巴克