Я могу сказать CLR упорядочивать неизменные объекты между AppDomains ссылкой?

Осложнение, что вам нужна глобальная замена, но только внутри шаблонов маркеров, может быть обработано путем захвата этой подстроки и выполнения регулярного выражения в ней в заменяющей части

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
12
задан Yona 5 May 2009 в 13:43
поделиться

3 ответа

Маршаллинг на самом деле довольно сложен .

Поведение, которое вы описываете, называется «маршалингом за обрез», среда выполнения использует его для маршалинга строк (иногда) и маршалинга System.Threading.Thread ВСЕГДА.

Насколько я могу судить, у вас нет контроля над этим (в статье упоминается, что вы можете определять настраиваемое поведение маршалинга, но я не могу найти по нему никакой документации), вы потенциально можете передать IntPtr и использовать небезопасный код чтобы смоделировать это, но для меня это пахнет огромным взломом.

8
ответ дан 2 December 2019 в 23:08
поделиться

У вас есть только две семантики маршалинга в .NET Remoting: маршал по значению (SerializableAttribute) и маршал по ссылке (MarshalByRef).

Как вы упоминали, строки маршалируются по значению, так как System.String имеет атрибут SerializableAttribute.

Если вы хотите передать свой объект между доменами приложений и хотите получить только копию (никакие изменения в объекте в удаленном домене приложений не влияют на объект в локальном домене приложений), тогда вам нужно использовать атрибут SerializableAttribute в вашем классе.

Надеюсь, это поможет.

-1
ответ дан 2 December 2019 в 23:08
поделиться

Я так не думаю, нет. Я считаю, что это, как и примитивы, обрабатывается непосредственно средой выполнения.

0
ответ дан 2 December 2019 в 23:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: