Одинарные кавычки ''
не интерполируют переменные или управляющие символы.
Это именно то, как работает 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
}