2009-03-15 3 views
3

Если бы я был:Как вставить текст в строку в Perl?

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

как бы вставить в текст «..» после текста 12 в переменной?

+0

Вопрос не совсем понятно. Я не уверен, что вы пытаетесь сделать. –

+0

Что именно вы думаете в вашей переменной $ foo сейчас? Вы пытались запустить это с включенными предупреждениями? – Telemachus

ответ

17

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

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

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

Вставка текста после того, как "12." может быть сделано многими способами (TIMTOWDI). Общим решением является использование substitution в соответствии с текстом, который вы хотите заменить.

$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

Если вы продолжаете писать ответы на это подробно (и учитывая, насколько вы заняты в списке почтовых отправлений Perl Beginners), я сомневаюсь, что вы сделаете какую-либо работу вообще. К счастью, у SO нет большого объема вопросов Perl ... – Telemachus

+1

Хе-хе, вы можете заметить, что они могут посещать PB-воски и ослабевать. Я, как правило, ухожу в PB, когда мне либо мало что нужно делать, либо я настолько расстроен, что в любом случае я ничего не могу сделать. Все это является частью моей подготовки, чтобы быть тренером (вот почему я перехожу к гипер-подробным ответам). –

+0

Это чертовски ответ. – SquareCog

0

Если вы хотите использовать двойные кавычки в строку в 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" 

Есть также большое количество другой Quote-like Operators вы могли бы использовать вместо этого.

0

$foo = "12.\"bar bar bar\"|three"; 
$foo =~s/12\./12\.\.\./; 
print $foo; # results in 12...\"bar bar bar\"|three" 
Смежные вопросы