perl:如果变量存在,则将变量追加到字符串

时间:2016-06-30 20:20:52

标签: perl

我想要做的是创建一个字符串,如果变量的计算结果为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";

但是这给了我一个语法错误。或者如果有一种方法可以在字符串中使用替换,那就更好了。

2 个答案:

答案 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)

最好的选择是在变量进入时对其进行清理,但是如果要导入很多变量,那么为那些定义的变量填充参数或变量列表可能会更清晰。那些没有价值的东西。然后你可以加入你的空间。

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]/}之类的操作,以确保传入了一个字母或数字,这应该可以解决大多数空白字符串问题。您还可以实现 trim 并查看 length 或其他一些指标来清理您的输入 - 无论您最不需要的是什么。

<强> 编辑:
因为可能有更广泛的格式,上面创建了一个单独的子例程,但它可以很容易地被编码为my @arr = map{"<$_>"} grep {defined and length} @_;而根本没有使用sub format_input...