LINUX.ORG.RU

[perl][тупняк] regexp и знак вопроса

 ,


0

1

Всем доброго времени суток. Есть простой скрипт (regexp максимально упростил)


#!/usr/bin/env perl
use strict;
use warnings;

my ($str1, $str2) = @ARGV;
if($str2 =~ m/^$str1$/i) {
	print "ok\n";
} else {
	print "not ok\n";
}

То есть, передаем на вход две строки и проверяем на матч.

Далее поведение следующее:

$ ./1.pl test test

ok

$ ./1.pl test1 test1

ok

$ ./1.pl test? test?

not ok

$ ./1.pl test?1 test?1

not ok

То есть, не происходит совпадения, если в строках присутствует знак вопроса.

Также, если в regexp'е убрать $:

$str2 =~ m/^$str1/i
то одинаковые строки совпадают всегда, вне зависимости от наличия знака вопроса.

Не подскажете, с чем связано такое поведение? Как следует строить выражение, чтобы одинаковые строки, содержащие знак вопроса, совпадали? Где можно про это почитать, чтобы не напороться на аналогичные грабли с другими символами?

Заранее спасибо.

☆☆☆☆☆

Э... perldoc perlre!

Знак вопроса — служебный символ. В частности, «x?» означает «х или ничего». (поэтому test? совпадает с qr/^test?/)

А есть ещё x*?, x+?, (?:x) и т.д. Это всё описано в штатной документации.

lodin ★★★★
()
Ответ на: комментарий от lodin

И ещё. Может быть, Вас заинтересует конструкция $x =~ m,\Q$y\E,i — от «ку» до «е» сцепсимволы не читаются вообще. Это, опять же, есть в официальной документации.

lodin ★★★★
()

quotemeta попробуйте.. Иначе test? вставляется в регулярку как есть. (считатйе что етсь функция regexp_compile($expression) в которую попадает все что передаете в регексп.)

OxiD ★★★★
()
Ответ на: комментарий от josephson

Да, это я пробовал, eq даёт истину.

DELIRIUM ☆☆☆☆☆
() автор топика

Решил:

$ ./1.pl test\\? test?

ok

Всем спасибо, а я протупил (давно ничего не перлил =) )

DELIRIUM ☆☆☆☆☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.