Re: Обнуление выделений при использовании map

Maxim Dounin mdounin на mdounin.ru
Пт Май 22 12:33:01 UTC 2020


Hello!

On Thu, May 21, 2020 at 10:33:25PM -0400, gz wrote:

> При использовании регулярных выражений в map обнуляются выделения уровня
> location, даже в случае, если в выражениях map не используются выделения.

[...]

> Из формулировки в документации складывается ощущение, что значения
> позиционных выделений location'а будут переопределены если они используются
> в map.
> Но если их в map нет, странно получать пустые значения.
> 
> Я неправильно понимаю документацию или это ошибка?

Ощущение складывается неправильное, переменные $1..$9 всегда 
относятся к последнему поматчившемуся регулярному выражению.  Если 
в этом последнем выполненном регулярном выражении выделений нет 
(или конкретное выделение не поматчилось, например, из-за 
ветвлений), то они будут пустыми.

Это общий принцип работы переменных $1..$9 приблизительно везде, 
так что он, видимо, в явном виде в документации не описан.  
Скажем, в перле то же самое можно пронаблюдать так:

$ echo foobar | perl -nle 'm/(...)/; print "match: $1"; m/foo/; print "match: $1";'
match: foo
match: 

С учётом декларативной природы конфигурации nginx'а - такое 
поведение делат переменные $1..$9 малопригодными для использования 
в сложных конфигурациях.  Особенно следует быть осторожным при 
использовании $1..$9, если значения получены из регулярных 
выражений в server_name или location: работать будет только в 
совсем простых конфигурациях.  В сколько-нибудь сложных случаях 
правильно, если есть необходимость использовать выделения, 
использовать именованные выделения.

-- 
Maxim Dounin
http://mdounin.ru/


Подробная информация о списке рассылки nginx-ru