首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl换行符在单引号字符串(或从文件中读取的行)中不强制执行

问Perl换行符在单引号字符串(或从文件中读取的行)中不强制执行
EN

Stack Overflow用户
提问于 2018-09-20 16:06:29
回答 3查看 1.3K关注 0票数 1

我有一个Perl脚本,可以逐行读取文件,其中一些行包含换行符(\n),但没有强制执行。

下面是我试过但不为我工作的例子

代码语言:javascript
复制
    my $var1 = 'Hello \n world';
    my $var2 = "$var1";
    my $var3 = '$var1';

    print "    $var2 \n" ;
    print $var3;

输出是

代码语言:javascript
复制
       Hello \n world
       $var1

但我想要像下面这样

代码语言:javascript
复制
        Hello
        world

当我从文件中读取一行时,该行中有换行符,需要强制执行换行符。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-09-20 16:16:01

单引号''不插入变量或控制字符。

这正是Perl的工作方式。

如果您是print '\n',它将打印一个文本反斜杠\和一个文本n n。如果将它赋值给一个变量,它还将指定一个文本反斜杠和一个文本n。

将变量插入到另一个字符串(如"$foo" )中只会插入$foo,但它仍然包含一个文本反斜杠和一个文本n。

如果还想插值,则必须使用字符串eval。

代码语言:javascript
复制
my $foo = 'Hello\nWorld';
print eval "qq{$foo}";

双引号""用于将$foo插入到值Hello\nWorld,因此文字文本将被eval看到,qq{}双引号用于将该字符串包装成一个插值双引号,以便eval将其作为插值双引号并进行插值。

但请不要那样做。在大多数情况下,您的eval.不希望使用字符串。

由于您正在讨论的是从文件中读取,所以这是不同的。如果您从一个文件中读取一个字符串,并且它包含文字\和文字n,那么这就是而不是换行符。\n转义序列只是用于创建换行符(即在ASCII )的可视化表示。所以你的文件没什么特别之处。只有两个角色。

在处理文件时,可以用\和n替换文本\n。

代码语言:javascript
复制
while (my $line = <$fh>) {
    chomp $line;
    $line =~ s/\\n/\n/g; # \\ creates literal backslash, second half is interpolated
}
票数 3
EN

Stack Overflow用户

发布于 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执行它。

代码语言:javascript
复制
my $s = 'Hello \n world'."\n";
$s =~ s/\\n/\n/g;
print($s);
票数 2
EN

Stack Overflow用户

发布于 2018-09-20 16:28:41

如果要用示例中的换行符和空格替换文字序列\n:

代码语言:javascript
复制
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

输出:

代码语言:javascript
复制
    Hello
    world

但是,如果空白是示例输出的无意中的工件,则请在文件中使用s/\\n/\n/。这种情况很好地说明了Perl字符串中的串内插和\n是\\n,或者是转义换行符。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52429131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档