Также и с циклическим блоком while. Ему в пару существует оператор until означающий отрицание while. Например вместо:
while(!eof(FILE)) {
# Операторы ...
}
можно написать:
until(eof(FILE)) {
# Операторы ...
}
Синтаксис оператора for выглядит следующим образом:
for($i=0;$i<10;$i++) { # Выходим из цикла при $i<10
print $i; # Начальное значение $i=0
} # При каждой прокрутке цикла увеличиваем $i на 1
Следующий оператор foreach предназначен специально для массивов и предоставляет возможность пройтись по всем его элементам, поочерёдно присваивая каждый элемент каой-то переменной:
foreach $переменная (@массив) {
# Операторы...
}
или
foreach (@массив) {
# Операторы
}
В последнем примере используется особенность Perl - переменная по умолчанию$_. Именно ей присваивается каждый элемент массива. Данная переменная сопоставляется и с регулярными выражениями, например фрагмент кода:
@data=<STDIN>;
foreach(@data) {
chomp;
print if /^From:/;
}
Пожалуй самым большим преимуществом языка Perl над другими является поддержка регулярных выражений.
Синтаксически регулярное выражение записывется между слэшами: /regular/.
Вот самый простой пример применения регулярных выражений:
Рассмотрим специальные символы, входящие в регулярные выражения:
Конструкция
Значение
Пример использования
.
Соответствует любому символу
print if /ab.c/;
[множество символов]
Соответствует любому символу из данного множества
/[abc]d/; # Соответствует ad, bd и cd
[^множество символов]
Отрицание множества символов
/^[xyz]/; # Соответствует всему, что не содержит x, y или z
(...)
Группировка элементов с их запоминанием в переменные $1, $2, $3 и т.д.
/(xyz)*//([abc].[^xy]qwerty)/;
(...|...|...)
Одна из альтернатив
/(ftp|http|mailto)/;
*
Повторение образца 0 или более раз
/*./; # Соответствует всему
?
Повторение 0 или 1 раз
none
+
Повторение 1 или более раз
none
{n,m}
Повторение от n до m раз
none
{n}
Повторение ровно n раз
none
{n.}
Повторение n и более раз
none
^ $
Соответствует началу и концу строки
/^http/;
/\.cgi$/;
\t \r \n
Управляющие символы: табуляция, возврат каретки и перевод строки соответственно
none
\d (/D)
Соответствует цифре или отрицает её, аналог [0-9] ([^0-9])
none
\w (/W)
Соответствует букве или отрицает её
none
\s (/S)
Соответствует пробелу или отрицает его (включая табуляцию и переход на новую строку)
none
\b (/B)
Соответствует границе слова или отрицает её
$test1="this is test";
$test2="wise";
if($test1=~/\bis\b/) { print "1"; } # Соответствует
if($test2=~/\bis\b/) { print "0"; } # Не соответствует
/\Bis\B/ #соответтсвует 'wise' но не 'is'
i
Игнорирует регистр
if($test=~/test/i) { print "Not register"; }
# Соответствует как test, так и TEST
С помощью регулярных выражений можно также производить замену одних символов другими. Синтаксис замены: s/выражение/строка/;
Опция g осуществляет замену по всей строке (глобальная замена). Опция e используется для подстановки в выражение второй строки полностью. Рассмотрим пример замены:
$x="This is test";
$x=~s/ /_/g;
print $x; # Выведет "This_is_test"