[英]perl: append variable to string if it exists
我想做的是创建一个字符串,如果变量的值为true,则该字符串在中间具有特定的字符串,但如果没有则省略该部分。 所以我正在尝试这样做:
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";
但这给了我一个语法错误。 或者,如果有一种使用字符串内替换的方法,那会更好。
shift
变量从@_
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
,但这比较麻烦。
最好的选择是清理传入的变量,但是,如果要大量导入变量,则为定义的变量grep参数或变量列表grep可能会更干净,从而过滤掉没有值的变量。 然后,您可以将它们与您的空间一起加入。
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]/}
来确保传入的字母或数字可以解决大多数空白字符串问题。 您还可以进行修剪并查看长度或其他度量标准以清理您的输入-最好地传达您的需求。
编辑:
因为可能会有更广泛的格式设置,所以上面的代码创建了一个单独的子例程,但是它可以像my @arr = map{"<$_>"} grep {defined and length} @_;
一样容易地编码my @arr = map{"<$_>"} grep {defined and length} @_;
完全没有sub format_input...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.