我有一个Perl脚本,可以逐行读取文件,其中一些行包含换行符(\n),但没有强制执行。
下面是我试过但不为我工作的例子
my $var1 = 'Hello \n world';
my $var2 = "$var1";
my $var3 = '$var1';
print " $var2 \n" ;
print $var3;输出是
Hello \n world
$var1但我想要像下面这样
Hello
world当我从文件中读取一行时,该行中有换行符,需要强制执行换行符。
发布于 2018-09-20 16:16:01
单引号''不插入变量或控制字符。
这正是Perl的工作方式。
如果您是print '\n',它将打印一个文本反斜杠\和一个文本n n。如果将它赋值给一个变量,它还将指定一个文本反斜杠和一个文本n。
将变量插入到另一个字符串(如"$foo" )中只会插入$foo,但它仍然包含一个文本反斜杠和一个文本n。
如果还想插值,则必须使用字符串eval。
my $foo = 'Hello\nWorld';
print eval "qq{$foo}";双引号""用于将$foo插入到值Hello\nWorld,因此文字文本将被eval看到,qq{}双引号用于将该字符串包装成一个插值双引号,以便eval将其作为插值双引号并进行插值。
但请不要那样做。在大多数情况下,您的eval.不希望使用字符串。
由于您正在讨论的是从文件中读取,所以这是不同的。如果您从一个文件中读取一个字符串,并且它包含文字\和文字n,那么这就是而不是换行符。\n转义序列只是用于创建换行符(即在ASCII )的可视化表示。所以你的文件没什么特别之处。只有两个角色。
在处理文件时,可以用\和n替换文本\n。
while (my $line = <$fh>) {
chomp $line;
$line =~ s/\\n/\n/g; # \\ creates literal backslash, second half is interpolated
}发布于 2018-09-20 16:16:24
您似乎认为是print将\n转换成换行符,但事实并非如此。正如您已经发现的,如果您从一个文件中读取Hello \n world␊并将其传递给print,它将打印Hello \n world␊。
产生转换字符串的是双引号字符串本身。对前辈来说,
'Hello \n world'生成14个字符的字符串Hello \n world。"Hello \n world"生成13个字符的字符串Hello ␊ world。如果您希望对输入执行某种类型的转换,则需要告诉Perl执行它。
my $s = 'Hello \n world'."\n";
$s =~ s/\\n/\n/g;
print($s);发布于 2018-09-20 16:28:41
如果要用示例中的换行符和空格替换文字序列\n:
use warnings;
use strict;
my $var1 = 'Hello \n world';
my $var2 = "$var1";
my $var3 = '$var1';
my $s = " $var1 \n";
$s =~ s/\\n/\n /;
print $s输出:
Hello
world但是,如果空白是示例输出的无意中的工件,则请在文件中使用s/\\n/\n/。这种情况很好地说明了Perl字符串中的串内插和\n是\\n,或者是转义换行符。
https://stackoverflow.com/questions/52429131
复制相似问题