gpt4 book ai didi

perl - 如何插入存储在perl变量中的转义字符?

转载 作者:行者123 更新时间:2023-12-01 16:34:18 25 4
gpt4 key购买 nike

我写了一个perl代码来获取源文件名、目标文件名、模式和替换字符串。下面是我写的代码。

chomp($input=<stdin>);   #source file name.
open SRC, $input; #opening the file .

chomp($input=<stdin>); #destination file name.
open DES, ">>$input"; #opening the file.

chomp($pattern=<stdin>); #pattern to be matched.

chomp($replace=<stdin>); #replacement string.

while(<SRC>){
s/$pattern/$replace/g;
print DES $_;
}

我编写了这段代码来替换文件中的特定值并将其存储在另一个文件中。根据代码,如果我将模式“”(空白)和替换字符串作为\n 给出,它应该给出如下输出。

示例输入

Hai hello this for testing .

示例输出

Hai 
hello
this
for
testing
.

但是它给出了如下输出。

输出

hai\nhello\nthis\nis\nfor\ntesting\n.

请帮我解决这个问题。

最佳答案

拜托,你必须始终在你编写的每个 Perl 程序的顶部 use strictuse warnings 'all',end declare every带有 my 的变量。您还应该使用词法文件句柄和 open 的三参数形式,并且始终检查对 open 的调用是否成功。所以

open DES, ">>$input"

应该更像

open my $des_fh, '>>', $input or die qq{Unable to open "$input" for appending: $!}



您可以为此使用eval,但使用String::Interpolate 更干净、更安全。模块,它提供对 perl 中处理双引号字符串的代码的访问。它导出 interpolate 函数,该函数将正确转换所有变量引用以及任何特殊字符,如 \n\t

看起来像这样

use strict;
use warnings 'all';

use String::Interpolate 'interpolate';

chomp( my $in_file = <> );
open my $in_fh, '<', $in_file or die qq{Unable to open "$in_file" for input: $!};

chomp( my $out_file = <> );
open my $out_fh, '>>', $out_file or die qq{Unable to open "$out_file" for input: $!};

chomp( my $pattern = <> );

chomp( my $replace = <> );
$replace = interpolate($replace);

while ( <$in_fh> ) {
s/$pattern/$replace/g;
print $out_fh $_;
}

请注意,您可以在命令行中输入参数,而不是让程序提示它们

use strict;
use warnings 'all';

use String::Interpolate 'interpolate';

my $pattern = shift;
my $replace = shift;
$replace = interpolate($replace);

print s/$pattern/$replace/gr while <>;

你可以这样调用它

$ perl replace.pl ' '  '\n'  sample.txt

并且您可以以正常方式将输出重定向到文件

$ perl replace.pl ' '  '\n'  sample.txt > output.txt

关于perl - 如何插入存储在perl变量中的转义字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37344769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com