Perl — если строка содержит текст?

Я хочу использовать curl для просмотра источника страницы, и если этот источник содержит слово, соответствующее строке, он выполнит печать. Как бы я сделал if $string contains?

В VB вроде бы.

dim string1 as string = "1"
If string1.contains("1") Then
Code here...
End If

Что-то похожее на это, но на Perl.


person Hellos    schedule 10.08.2011    source источник
comment
что вы пытаетесь сделать с этим кодом? Конечно, вы знаете, что нельзя анализировать URL-адреса с помощью регулярных выражений (даже не собираетесь использовать известную ссылку). Вы можете попробовать включить такой движок, как WWW::Mechanize или LWP::UserAgent, чтобы получить страницу и анализатор, например HTML::TokeParser, чтобы получить нужную информацию.   -  person Joel Berger    schedule 10.08.2011


Ответы (3)


Если вам просто нужно найти одну строку внутри другой, используйте функцию index (или < a href="http://perldoc.perl.org/functions/rindex.html" rel="noreferrer">rindex, если вы хотите начать сканирование с конца строки):

if (index($string, $substring) != -1) {
   print "'$string' contains '$substring'\n";
}

Чтобы найти в строке соответствие шаблону, используйте оператор сопоставления m//:

if ($string =~ m/pattern/) {
    print "'$string' matches the pattern\n";       
}
person Eugene Yarmash    schedule 10.08.2011
comment
только для подстроки вы должны использовать index, что примерно в 4 раза быстрее, чем регулярное выражение. - person Grace Shao; 19.09.2012

if ($string =~ m/something/) {
   # Do work
}

Где something — регулярное выражение.

person Sean Bright    schedule 10.08.2011
comment
но что, если что-то находится в переменной? - person Eric Hartford; 02.06.2012
comment
@Eric оператор m// интерполирует переменные. - person Eugene Yarmash; 27.07.2012
comment
Нет необходимости в операторе сопоставления, если то, что вы сопоставляете, не является регулярным выражением. Для простой текстовой строки функция index работает просто отлично. - person Dave Cross; 28.07.2012

Для поиска строк без учета регистра используйте index (или rindex) в сочетании с fc. Этот пример расширяет ответ Евгения Ярмаша:

use feature qw( fc ); 
my $str = "Abc"; 
my $substr = "aB"; 

print "found" if index( fc $str, fc $substr ) != -1;
# Prints: found

print "found" if rindex( fc $str, fc $substr ) != -1;
# Prints: found

$str = "Abc";
$substr = "bA";

print "found" if index( fc $str, fc $substr ) != -1;
# Prints nothing

print "found" if rindex( fc $str, fc $substr ) != -1;
# Prints nothing

И index, и rindex возвращают -1, если подстрока не найдена.
А fc возвращает версию своего строкового аргумента в сложенном виде, и здесь его следует использовать вместо (более привычных) uc или lc. Не забудьте включить эту функцию, например, с помощью use feature qw( fc );.

ДЕТАЛИ:

Из документов fc:

Сворачивание регистров — это процесс преобразования строк в форму, в которой различия регистров стираются; сравнение двух строк в их регистро-свернутой форме — это фактически способ узнать, равны ли две строки, независимо от регистра.

Из часто задаваемых вопросов по Unicode:

В: В чем разница между картированием случаев и сворачиванием случаев?

О: Отображение регистра или преобразование регистра — это процесс, посредством которого строки преобразуются в определенную форму — верхний регистр, нижний регистр или заглавный — возможно, для отображения пользователю. Свертывание регистра в основном используется для сравнения текста без регистра, например идентификаторов в компьютерной программе, а не для фактического преобразования текста. Свертывание регистра в Unicode в основном основано на сопоставлении нижнего регистра, но включает дополнительные изменения исходного текста, которые помогают сделать его нечувствительным к языку и согласованным. В результате текст, сложенный регистром, должен использоваться исключительно для внутренней обработки и, как правило, не должен храниться или отображаться для конечного пользователя.

person Timur Shtatland    schedule 01.09.2020
comment
Не могли бы вы уточнить, что такое версия строкового аргумента в регистре? - person mabalenk; 07.06.2021
comment
@mabalenk Это операция, выполняемая для сравнения строк без учета регистра. Я добавил уточнение к ответу. - person Timur Shtatland; 07.06.2021