Символ новой строки Perl не применяется внутри строки в одинарных кавычках (или строки, прочитанной из файла) - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть скрипт Perl для чтения файла строка за строкой, и некоторые строки содержат символ новой строки (\ n), но он не применяется.

Вот пример, который я пробовал и не работаетдля меня

    my $var1 = 'Hello \n world';
    my $var2 = "$var1";
    my $var3 = '$var1';

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

выход -

       Hello \n world
       $var1

, но я хочу, как показано ниже

        Hello
        world

Когда я читаю строку из файла, строка имеетсимвол новой строки в нем, и этот символ новой строки должен быть приведен в исполнение.

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

Вы, кажется, думаете, что 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);
0 голосов
/ 20 сентября 2018

Если вы хотите заменить буквенную последовательность \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/ в вашем файле, если пробел был непреднамеренным артефактом вашего примера вывода.Эта ситуация является хорошей иллюстрацией интерполяции строк и \n в строке Perl: \\n, или экранированный перевод строки.

0 голосов
/ 20 сентября 2018

Одинарные кавычки '' не интерполируют переменные или управляющие символы.

Это именно то, как работает 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 - это просто визуальное представление, используемое для создания символа новой строки, которое 0x0A в ASCII .Таким образом, ваш файл не содержит ничего особенного.Всего два символа.

Вы можете заменить литерал \ и n на \n при обработке файла.

while (my $line = <$fh>) {
    chomp $line;
    $line =~ s/\\n/\n/g; # \\ creates literal backslash, second half is interpolated
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...