Почему экранирование # исчезает при чтении из массива? - PullRequest
1 голос
/ 20 июля 2011

У меня есть строка,

my $element="abc#$def"

Я использую #, # 1004 *

 $element=~s/#/\\#/g;

Она печатается как: abc\#$def, что идеально.

Следующая часть кода:

push(@arr,$element);
foreach $val (@arr)
{
 print $val;
}

И значение, напечатанное в цикле foreach: abc#$def.

Почему здесь не экранируется #?И как я могу сохранить побег?

Ответы [ 2 ]

2 голосов
/ 20 июля 2011

Ты не совсем нам все показываешь. Чтобы получить заявленный результат, мне нужно было создать переменную $def, инициализированную, как показано ниже. Но когда я это делаю, я получаю ожидаемый вами результат, а не тот, который вы показываете.

$ cat xx.pl
use strict;
use warnings;

my $def = '$def';
my $element = "abc#$def";

$element =~ s/#/\\#/g;

print "$element\n";

my @arr;

push(@arr, $element);
foreach my $val (@arr)
{
    print $val;
    print "\n";
}

$ perl xx.pl
abc\#$def
abc\#$def
$

Это было протестировано с Perl 5.14.1 на MacOS X 10.6.8, но я не думаю, что поведение будет отличаться с любой другой версией Perl 5.

Учитывая это, вы можете обновить свой вопрос, чтобы показать скрипт, похожий на мой (в частности, с use strict; и use warnings;), но который дает результат, который вы показываете?

0 голосов
/ 20 июля 2011

С чем-то вроде этого:

$element=~s/#/\\#/g;

Вы должны выйти из \

Редактировать

этот код работает на моей машинекак вы ожидаете:

use strict;
use warnings;
use Data::Dumper;

my $element='abc#$def';
my @arr;
$element=~s/#/\\#/g;

print $element."\n";

push(@arr,$element);
foreach my $val (@arr)
{
 print $val;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...