2016-09-20 2 views
1

Я думаю, это довольно простой вопрос, но после 20 минут поиска в Интернете я не смог найти ничего, чтобы решить мою проблему.В Perl существует оператор для проверки строки примерно для другой строки?

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

Я пробовал использовать ~ и ~~. ~ дает мне ошибку, и ~~ говорит, что не правильный оператор гадает. Я думал о ~ как-то вроде «грубо», но похоже, что это не так. Вот мой код:

open (INPUT, "<", $curfile); 
while (<INPUT>) { 
$firsttenchars= substr ($_, 0, 10); 
if ($firsttenchars ~ "OK") 
    { 
    print "success"; 
    }    
} 
close INPUT; 
+2

Когда я прочитал название, я подумал, что вам нужно нечеткое совпадение, то есть 'ofobra' вместо' foobar'. Возможно, поэтому вам не удалось найти то, что вы хотели, особенно если английский не является вашим родным языком. Иногда трудно точно описать проблему. – simbabque

+0

Да, это так верно, мне даже потребовалось несколько минут, чтобы написать это название, хотя на самом деле я не спросил кого-то на своем родном языке. –

ответ

8

Вы ищете паттерн-матче.

if ($firsttenchars =~ m/OK/) { ... } 

Это возвращает истину, если символьная строка 'OK' (чувствителен к регистру) находится где-то внутри $firsttenchars. Меня не волнует, как часто, и как только он находит это, он перестает смотреть.

Материал внутри // - это регулярное выражение, короткое regex. Они используются для креации узоров. =~ - это binding operator, который связывает скалярное значение ($firsttenchars) с совпадением шаблонов. mm// является оператором сопряжения. Существует также s///, который используется для замены чего-либо шаблоном.

Вы можете прочитать perlrequick, perlre и perlretut для получения дополнительной информации. regex tag wiki here on Stack Overflow - потрясающий ресурс, который можно начать с регулярных выражений.


Оператор ~ является оператором побитового отрицания.

Унарный "~" выполняет побитовое отрицание, то есть дополнение 1. Например, 0666 & ~ 027 - 0640. (См. Также Integer Arithmetic and Bywise String Operators.) Обратите внимание, что ширина результата зависит от платформы: ~ 0 имеет ширину 32 бит на 32-битной платформе, но шириной 64 бит на 64-битной платформе, поэтому, если вы ожидаете некоторую ширину бита, не забудьте использовать оператор «&» для маскировки лишних битов.

Оператор ~~ называется smart match. Это было какое-то время в Perl, и это должно было делать умные вещи. Он ведет себя по-другому, основываясь на том, что у вас есть на RHS (правая сторона) и LHS (левая сторона). Это все еще считается экспериментальным, и многие люди в сообществе Perl считают это спорным. Вы использовали его с двумя скалярами, причем оба они содержат строки. Это превращает его в eq, который проверяет равенство строк.

Любые строки равенство
как: Любой эк Любой

Полный обзор всех операторов в Perl можно найти в perlop. Обратите внимание, что это ссылки на самую последнюю версию (5.24 на момент написания). Ваш Perl может быть старше, и, возможно, не все из них.


Более быстрый способ проверки, если 'OK' содержится внутри этой строки является the index built-in. Он возвращает первое вхождение строки в другую строку. Поскольку он возвращает -1, если он не находит эту строку, вам нужно явно проверить возвращаемое значение.

if (index($firsttenchars, 'OK') != - 1) { ... } 

Это немного больше, чем писать по шаблону, но это намного быстрее.

+1

работает, спасибо. Я действительно не знаю, хотел ли мне тот факт, что это просто или ненавидит, потому что я не мог понять это. –

+1

@ ZesaRex regex - сложная тема, но она очень мощная и очень простая в Perl. Если вы довольно новичок в Perl, я предлагаю вам получить копию книги Perl_ _Learning, которая имеет две главы по регулярному выражению и займет от трех до пяти вечеров. Ovid's _Beginning Perl_ также является отличным ресурсом, если вы уже знаете какое-то программирование. Не бейте себя, потому что не зная об этом. Если вы никогда не слышали, что что-то подобное существует, это не ваша вина, о которой вы не знаете. :) – simbabque

+5

@ZesaRex Вы не можете «_истроить out_» такие вещи. Нужно читать на нем :) – zdim