#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
, ни один из которых не является регулярным выражением, и один из которых не имеет ничего общего с регулярным выражением. Оператор, который создает регулярное выражение, даже не используется=~
.