繁体   English   中英

perl:将变量附加到字符串(如果存在)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM