我想要做的是创建一个字符串,如果变量的计算结果为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";
但是这给了我一个语法错误。或者如果有一种方法可以在字符串中使用替换,那就更好了。
答案 0 :(得分: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中,并且没有声明额外的变量
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
,但这更麻烦。
答案 1 :(得分:1)
最好的选择是在变量进入时对其进行清理,但是如果要导入很多变量,那么为那些定义的变量填充参数或变量列表可能会更清晰。那些没有价值的东西。然后你可以加入你的空间。
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]/}
之类的操作,以确保传入了一个字母或数字,这应该可以解决大多数空白字符串问题。您还可以实现 trim 并查看 length 或其他一些指标来清理您的输入 - 无论您最不需要的是什么。
<强> 编辑: 强>
因为可能有更广泛的格式,上面创建了一个单独的子例程,但它可以很容易地被编码为my @arr = map{"<$_>"} grep {defined and length} @_;
而根本没有使用sub format_input...
。