2016-06-30 3 views
1

Что я хочу сделать, так это создать строку, которая в середине имеет определенную строку, если переменная оценивается как true, но опускает этот раздел, если это не так. Так что я пытаюсь сделать это:perl: добавьте переменную в строку, если она существует

my $var1 = "hello"; 
my $var2 = shift; 
my $var3 = "my friend"; 

if ($var2){ 
    print "$var1 <$var2> $var3\n"; 
} else { 
    print "$var1 $var3\n"; 
} 

Выход:

$ perl test.pl 
hello my friend 
$ perl test.pl there 
hello <there> my friend 

То есть, очевидно, совершенно функциональным, но мне интересно, если есть способ сделать чек инлайн. Что-то вроде:

print "$var1 " . ("<$var2> " if $var2) . "$var3\n"; 

Но это дает мне синтаксическую ошибку. Или, если есть способ сделать это, используя подстановку внутри строки, это будет еще лучше.

+1

'print" $ var1 ". ($ var2? "<$var2>": ''). "$ var3 \ n"; ' – Miller

ответ

4

Для shift переменной из @_ и вставить его, если он там

print $var1 . (shift // '') . $var2; 

Например, с пространством, вставленной

sub concat { 
    my ($var1, $var2) = ("Hello", "Friend"); 
    print $var1 . (shift // ' ') . $var2, "\n"; 
} 

concat(); 
concat(" my dear "); 

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

 
Hello Friend 
Hello my dear Friend 

Если угловые скобки нужно вставить вокруг переменной, с $var2 уже объявили

print "$var1 " . (defined $var2 ? "<$var2>" : '') . "$var3\n"; 

В подлодки, и без объявления дополнительная переменная

sub concat { 
    my ($var1, $var2) = ("Hello", "Friend"); 
    print $var1 . (@_ ? ' <' . join(' ', @_) . '> ' : ' ') . $var2, "\n"; 
} 

concat(); 
concat("my dear"); 
concat("my", "very", "dear"); 

Отпечатки

Hello Friend 
Hello <my dear> Friend 
Hello <my very dear> Friend 

Снова измените обработку пространства, подходящего для приложения.


Вы также можете использовать substr условно на существующей строки, но это более громоздким.

+0

может ли это обрабатывать угловые скобки? то есть может ли он напечатать «привет» мой друг «или» «привет, мой друг»? умственно или включая или исключая '<>'? – ewok

+0

@ewok Правильно, я собирался спросить об этих угловых скобках - вы имеете в виду буквальные персонажи? (Или ... чтение из файла filehandle?) – zdim

+0

буквальные символы. Я хочу, чтобы угловые скобки находились в напечатанной строке, если '$ var2' оценивается как истина и пропущена иначе – ewok

1

. Лучшим вариантом является дезинфекция ваших переменных по мере их поступления, но если вы импортируете много, может быть более чистым, чтобы grep аргументы или список переменных для определены, который отфильтровывает те, которые имеют неважно. Затем вы можете присоединиться к тем, у кого есть пробелы.

CodePad

sub format_input{ 
    map{qq{<$_>}} @_; 
} 

sub func { 
    my $var1 = "hello"; 
    my $var2 = "my friend"; 
    my @arr = format_input grep{defined and length} @_; 
    my $string = join ' ', $var1, @arr, $var2; 
    print qq{$string\n}; 
} 

func("there");   # hello <there> my friend 
func('foo','bar');  # hello <foo> <bar> my friend 
func('foo',undef,'bar'); # hello <foo> <bar> my friend 
func('foo','','bar'); # hello <foo> <bar> my friend 
func();     # hello my friend 

На месте {defined}, вы могли бы сделать что-то вроде {/[\w\d]/}, чтобы убедиться, что там была буква или цифра передается в, который должен заботиться о большинстве пустых вопросов строки. Вы также можете использовать обрезку и посмотреть длину или какую-либо другую метрику для дезинфекции вашего входа - независимо от того, что наилучшим образом связывает ваши потребности.


Edit:
Потому что может быть более обширное форматирование, выше создал отдельную подпрограмму, но это могло бы так же легко было закодировано как my @arr = map{"<$_>"} grep {defined and length} @_;, без sub format_input... используется вообще.

+0

Как это можно улучшить для обработки угловых скобок? Я не просто хочу «привет, мой друг» «Хочу» «привет» мой друг »' – ewok

+0

@ewok final edit, чтобы показать, что перед форматированием нужно дезинфицировать, чтобы принимать неопределенные и пустые строки вводов; если пустые строки должны быть представлены как '<>', тогда удалите * и длину 'из условия grep. – vol7ron

Смежные вопросы