Непревзойденный) в reg при использовании функции lc

#perl #lowercase

#perl #нижний регистр

Вопрос:

Я пытаюсь запустить следующий код:

 $lines = "Enjoyable )) DAY";
$lines =~ lc $lines;
print $lines;
 

Он завершается ошибкой во второй строке, где я получаю ошибку, указанную в названии. Я понимаю, что скобки вызывают проблемы. Я думаю, что мог бы использовать «quotemeta», но дело в том, что моя строка содержит информацию, которую я продолжу обрабатывать позже, поэтому я хотел бы сохранить строку неповрежденной, насколько это возможно, и не вмешиваться в нее слишком сильно.

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

1. Чего вы пытаетесь достичь? Утверждение $lines =~ lc $lines на самом деле не имеет никакого смысла. Вы имели в виду писать $lines = lc $lines ?

2. да, это действительно то, что я хотел написать… Спасибо!

Ответ №1:

Здесь у вас две проблемы.

1. =~ используется для выполнения определенного набора операций

=~ Оператор используется либо для сопоставления со // строкой, m// , qr// либо для замены на s/// или tr/// .

Если все, что вы хотите сделать, это ввести содержимое в нижний регистр $lines , тогда вам следует использовать = not =~ .

 $lines = "Enjoyable )) DAY";
$lines = lc $lines;
print $lines;
 

2. Регулярные выражения содержат специальные символы, которые необходимо экранировать

Если вы хотите сопоставить $lines с версией в нижнем регистре $Lines , которая должна возвращать true, если $lines уже была полностью в нижнем регистре, и false в противном случае, тогда вам нужно экранировать символы «)».

 #!/usr/bin/env perl

use strict;
use warnings;

my $lines = "enjoyable )) day";

if ($lines =~ lc quotemeta $lines) {
    print "lines is lower casen";
}

print $lines;
 

Обратите внимание, что это игрушечный пример, пытающийся найти причину для выполнения $lines =~ lc $lines — было бы намного лучше (быстрее, безопаснее) решить это с eq помощью as in $lines eq lc $lines .

См perldoc -f quotemeta . Или http://perldoc.perl.org/functions/quotemeta.html для получения более подробной информации о quotemeta.

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

1. (1) неверно. =~ используется для указания аргумента для операторов m , s и tr , ни один из которых не является регулярным выражением, и один из которых не имеет ничего общего с регулярным выражением. Оператор, который создает регулярное выражение, даже не используется =~ .

2. Хороший момент, я уточню свою формулировку. Я не уверен в вашем «операторе, который создает регулярное выражение …», хотя, если бы у вас был объект регулярного выражения, созданный с qr// помощью, который вы бы использовали =~ для сопоставления с ним, верно?

Ответ №2:

=~ используется для регулярных выражений. «lc» не является частью регулярного выражения, это такая функция: $new = lc ($ old);

Я не помню оператор регулярных выражений для нижнего регистра, потому что я постоянно использую lc() .

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

1. =~ используется для указания аргумента для операторов m , s и tr , ни один из которых не является регулярным выражением, и один из которых не имеет ничего общего с регулярным выражением. Оператор, который создает регулярное выражение, даже не используется =~ .