Осложнение, что вам нужна глобальная замена, но только внутри шаблонов маркеров, может быть обработано путем захвата этой подстроки и выполнения регулярного выражения в ней в заменяющей части
my $s = q(a1b x and x c2d x more x a22b x again x c33d x and x);
$s =~ s/a.*?b\K(.*?)(?=c.*?d)/$1=~s{x}{y}gr/eg;
say $s;
Я использую \K
после левой шаблон маркера (a.*?b
) для отбрасывания предыдущих совпадений и просмотра шаблона правого маркера (c.*?d
), чтобы не копировать их вокруг, но для простоты вы можете захватить их и использовать числовые переменные ([116 ]) для них в замен.
Рассмотрите возможность захвата правого маркера (вместо предвкушения), если шаблон повторяется; тогда для дополнительной копии данных подшаблон не сканируется повторно, и все регулярные выражения чище и в принципе безопаснее (может ли правый маркер содержать левый маркер?). Это усложняет замену, где $2
нужно сохранить перед новым регулярным выражением, так как оно в нем сбрасывается.
Обратите внимание на модификатор /r
в регулярном выражении заменяющей части: кроме того, что он очень удобен, он также позволяет нам использовать s///
для переменной $1
, что в противном случае мы не могли бы сделать, поскольку она только для чтения. [1116 ]
Если это часть более сложной обработки регулярных выражений, обратите внимание, что упреждение является утверждением нулевой ширины , поэтому движок не использует этот шаблон и не пропускает его. Это имеет значение, если весь шаблон повторяется: если возможно, что правый маркер содержит левый маркер, вы должны захватить его, чтобы двигатель прошел мимо него для следующего матча, чтобы левый маркер был первым для него.
Это работает с переменными для шаблонов маркеров, которые вы любезно используете
my $start = qr/a.*?b/;
my $end = qr/c.*?d/;
my $s = q(a1b x and x c2d x more x a22b x again x c33d x and x);
$s =~ s/$start\K (.*?) (?=$end)/ $1 =~ s{x}{y}gr /egx;
say $s;
, где я размечал шаблоны для удобства чтения, благодаря /x
. Это печатает
a1b y and y c2d x more x a22b y again y c33d x and x
Маршаллинг на самом деле довольно сложен .
Поведение, которое вы описываете, называется «маршалингом за обрез», среда выполнения использует его для маршалинга строк (иногда) и маршалинга System.Threading.Thread ВСЕГДА.
Насколько я могу судить, у вас нет контроля над этим (в статье упоминается, что вы можете определять настраиваемое поведение маршалинга, но я не могу найти по нему никакой документации), вы потенциально можете передать IntPtr и использовать небезопасный код чтобы смоделировать это, но для меня это пахнет огромным взломом.
У вас есть только две семантики маршалинга в .NET Remoting: маршал по значению (SerializableAttribute) и маршал по ссылке (MarshalByRef).
Как вы упоминали, строки маршалируются по значению, так как System.String имеет атрибут SerializableAttribute.
Если вы хотите передать свой объект между доменами приложений и хотите получить только копию (никакие изменения в объекте в удаленном домене приложений не влияют на объект в локальном домене приложений), тогда вам нужно использовать атрибут SerializableAttribute в вашем классе.
Надеюсь, это поможет.
Я так не думаю, нет. Я считаю, что это, как и примитивы, обрабатывается непосредственно средой выполнения.