PERL: БИБЛИОТЕКА ПРОГРАММИСТА


PERL: БИБЛИОТЕКА ПРОГРАММИСТА - стр. 55


Следующий пример поразрядных строковых операций быстро отсекает у всех символов строки старшие биты:

Sstring &=  "\177"  х length($string),

Впрочем, о человеке, ограничивающем строки 7-разрядными символами, будут говорить все окружающие — и не в самых лестных выражениях.

D> Смотри также------------------------------------------------------------------------------------------

Описание функций uc, lc, ucfirst и lcfirst в perlfunc(l); описание метасим­волов \L, \U, \1 и \и в разделе «Quote and Quote-like Operators» perlop( 1).


46   Глава 1 • Строки

1.10. Интерполяция функций и выражений в строках

Проблема

Требуется интерполировать вызов функции или выражение, содержащиеся в строке. По сравнению с интерполяцией простых скалярных переменных это по­зволит конструировать более сложные шаблоны.

Решение

Выражение можно разбить на отдельные фрагменты и произвести конкатенацию:

Sanswer = $var1   .   func().   $var2;    # Только для скалярных величин

Также можно воспользоваться неочевидными расширениями @{ [LIST EXPR]} mm${\(SCALAR  EXPR)}:

Sanswer = "STRING @{[LIST EXPR]} MORE STRING" Sanswer = "STRING ${\(SCALAR EXPR)} MORE STRING",

Комментарий

В следующем фрагменте продемонстрированы оба варианта. В первой строке вы­полняется конкатенация, а во второй — фокус с расширением:

$phrase = "I have "  .   ($n + 1)      "guanacos.", Sphrase = "I have ${\($n +1)} guanacos ",

В первом варианте строка-результат образуется посредством конкатенации бо­лее мелких строк; таким образом, мы добиваемся нужного результата без интер­поляции. Функция print фактически выполняет конкатенацию для всего списка аргументов, и, если вы собираетесь вызвать print $phrase, можно было бы просто написать:

print "I have ",   $n + 1   .   "guanacos.\n",

Если интерполяция абсолютно неизбежна, придется воспользоваться вторым вариантом, изобилующим знаками препинания. Только символы @, $ и \ имеют особое значение в кавычках и обратных апострофах. Как и в случаях с т// и s///, синоним qx() не подчиняется правилам расширения для кавычек, если в качестве ограничителя использованы апострофы! $home = qx'echo home is $HOME'; возьмет переменную $НОМЕ из командного интерпретатора, а не из Perl! Итак, единствен­ный способ добиться расширения произвольных выражений — расширить ${} или @{}, в чьих блоках присутствуют ссылки.




Начало  Назад  Вперед