Как я могу вставить текст в строку в Perl? - PullRequest
4 голосов
/ 15 марта 2009

Если бы у меня было:

$foo= "12."bar bar bar"|three";

как бы вставить текст ".." после текста 12. в переменную?

Ответы [ 3 ]

18 голосов
/ 15 марта 2009

Perl позволяет вам выбирать свои собственные разделители цитат. Если вам нужно использовать двойную кавычку внутри интерполирующей строки (например, "") или одинарную кавычку внутри неинтерполирующей строки (например, ''), вы можете использовать оператор кавычки для укажите другой символ, который будет действовать в качестве разделителя строки. Разделители бывают двух видов: в скобках и без скобок. Ограничители в скобках имеют разные начальные и конечные символы: [], {}, (), [] и <>. Все остальные символы * доступны в качестве разделителей без скобок.

Таким образом, ваш пример может быть записан как

$foo = qq(12."bar bar bar"|three);

Вставка текста после «12». можно сделать разными способами ( TIMTOWDI ). Распространенным решением является использование подстановки для соответствия тексту, который вы хотите заменить.

$foo =~ s/^(12[.])/$1../;

^ означает совпадение в начале строки, () означает захват этого текста в переменную $1, 12 просто соответствует строке "12", а [] означает соответствие любому персонажей внутри скобок. Скобки используются потому, что . имеет особое значение в регулярных выражениях в целом, но не внутри класса символов ([]). Другой вариант для класса символов - это исключить специальное значение . с \, но многие люди считают, что это уродливее, чем класс символов.

$foo =~ s/^(12\.)/$1../;

Другой способ вставить текст в строку - присвоить значение для вызова substr. Это подчеркивает одну из довольно уникальных особенностей Perl: многие из его функций могут выступать в качестве lvalues. То есть они могут рассматриваться как переменные.

substr($foo, 3, 0) = "..";

Если вы еще не знали, где "12." существует в строке, вы можете использовать index, чтобы найти, где она начинается, length, чтобы узнать, как долго " 12.» и затем используйте эту информацию с substr.

Вот полнофункциональный Perl-скрипт, содержащий приведенный выше код.

#!/usr/bin/perl

use strict;
use warnings;

my $foo = my $bar = qq(12."bar bar bar"|three); 

$foo =~ s/(12[.])/$1../;

my $i = index($bar, "12.") + length "12.";
substr($bar, $i, 0) = "..";

print "foo is $foo\nbar is $bar\n";

* все символы, кроме пробельных символов (пробел, табуляция, возврат каретки, перевод строки, вертикальная табуляция и подача формы), то есть

0 голосов
/ 15 марта 2009

$foo = "12.\"bar bar bar\"|three";
$foo =~s/12\./12\.\.\./;
print $foo; # results in 12...\"bar bar bar\"|three"
0 голосов
/ 15 марта 2009

Если вы хотите использовать двойные кавычки в строке в Perl, у вас есть два основных варианта:

$foo = "12.\"bar bar bar\"|three";

или

$foo = '12."bar bar bar"|three';

Первый параметр экранирует кавычки внутри строки с обратной косой чертой.

Второй вариант использует одинарные кавычки. Это означает, что двойные кавычки рассматриваются как часть строки. Однако в одинарных кавычках все буквально, поэтому $var или @array не рассматриваются как переменные. Например:

$myvar = 123;
$mystring = '"$myvar"';
print $mystring;
> "$myvar"

Но:

$myvar = 123;
$mystring = "\"$myvar\"";
print $mystring;
> "123"

Существует также большое количество других цитирующих операторов , которые вы можете использовать вместо этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...