Обо мне

Моя фотография
Дикий Полярный Сов

пятница, 18 июня 2010 г.

Насущные вещи и perlянка.

Всем привет!

Вот немного разобрался со своими проблемами - ушел на очередной околоземный виток в институте (я снова четверокурсник, хаха), нашел себе новую работу (программист python+django, аккурат то, о чем я мечтаю вот уже полгода как), сейчас дорабатываю две недели в "Докторе" и сваливаю.

Впечатления от почти двух лет работы: в общем, все было ок (а местами даже лучше, чем ок), не особо и жалуюсь. Коллектив отличный, режим работы неплохой, занятия не особо скучные (в основном, но бывают, конечно, рутинные места, хотя - где их нет?). Добираться от дома, опять же, достаточно удобно :]

Но. Была очень серьезная проблема, которую разрешить не удалось. О чем я искренне сожалею. Мне будет не хватать вас, ребята.

Ну ладно, с лирически-грустной частью покончено. Теперь расскажу вам кое-что интересное.

А именно - о ключе 'e' в регулярных выражениях Perl. Тема эта для меня новая - не так уж и давно начал ее ковырять, поэтому если что - не обессудьте, буду рад выслушать всяческую критику, замечания и предложения.



Итак, ключ 'e'. Что же он делает?

Во-первых, он применяется только в выражениях замены, s///, стало быть. Нужен он для того, чтобы интерпретировать правую часть выражения замены и подставить результат интерпретации вместо части левой.

Ну например. Приспичило нам (пример настолько надуманный, что мне страшно, что же с моей фантазией) посчитать сумму, записанную в строке, тут же поделить результат на 2 и подставить в ту же строку вместо исходного выражения, заставив пользователя недоумевать - куда же делась еще половина суммы?

Не имея на руках волшебного ключа 'e', мы бы делали так (хотя вы бы, может, делали и не так):

my $var = 'blah blah blah 11+12 blah blah';
$var =~ /(\d+)\+(\d+)/;
my $result = ( $1 + $2 ) / 2;
$var =~ s/(\d+)\+(\d+)/$result/;
print $var;

Круто, да? Ну, относительно, честно говоря. Целых две операции с регулярными выражениями. А если нам надо произвести десяток замен, и каждую потребуется вычислить? Придется организовывать цикл.

А теперь мы используем волшебный ключ 'e':

my $var = 'blah blah blah 11+12 blah blah';
$var =~ s!(\d+)\+(\d+)!($1+$2)/2!e;
print $var;

В этот все гораздо круче и непонятнее - perl, ясное дело.

Строка "($1+$2)/2" интерпретируется (кстати, здесь, чтобы не экранировать символ слеша, я заменил ограничители регэкспа на восклицательные знаки), и результат "11.5" подставляется в строку.

Вот такая удобная фича. Про наличие ее в других языках не знаю, не изучал этот вопрос.

Комментариев нет:

Отправить комментарий