Perl中的三重故障

有一天,我在Perl遇到了一个困扰我的问题,仅仅是因为我还没有找到答案。 这是我的问题。 请看以下示例:

多变量分配:

Perl允许使用如下语法同时声明多个变量:

my ($var1, $var2) = (100, 200);
print "variable 1 is: $var1, variable 2 is: $var2 \n\n";

这将返回以下结果:

variable 1 is: 100, variable 2 is: 200
字符串分割:

很容易吧? 与大多数语言一样,Perl还允许拆分字符串。 拆分字符串的语法如下所示:

my $str1 = 'a sentence has many words';
my @arr1 = split / /, $str1;
foreach my $x ( @arr1 ) {
print "word: $x \n";
}

该示例的打印结果将为我们提供以下内容:

word: a 
word: sentence
word: has
word: many
word: words
三元运算符:

最后,Perl还允许三元运算符。 这是一种很好的合并代码的方式,并且可以将所有其他内容保持在同一行中,尽管对于哪种样式更好,更具可读性尚存争议。 无论如何,请采用以下字符串:

my $str2 = 'This string has two sentences -  A dash separates them';

现在,如果我们想根据条件语句进行拆分,则可以执行以下操作:

my @arr7 ;
if (index($str2, '-') != -1) {
@arr7 = split /-/,$str2;
} else {
@arr7 = split /:/,$str2;
}
print "========== array7[0]", $arr7[0], "\n";
print "========== array7[1]", $arr7[1], "\n";

此代码将为我们提供以下输出:

========== array7[0]This string has two sentences 
========== array7[1] A dash separates them

但是,通过使用三元运算符,我们可以获得更少的代码,而得到相同的输出。 如果编写如下,则上述if / else块将提供相同的输出:

my ( @arr2 ) = (index($str2, '-') != -1) ? split /-/,$str2 : split /:/,$str2;
print "arr2[0] is: ", $arr2[0], "\n";
print "arr2[1] is: ", $arr2[1], "\n";

我们的输出是:

arr2[0] is: This string has two sentences 
arr2[1] is: A dash separates them

现在,让我们从前面的if / else块开始,并添加两个数组。 我们将在if else块中设置每个数组的值。 我们的两个字符串如下:

my $str2 = 'This string has two sentences -  A dash separates them';
my $str4 = 'This string has different punctuation; a semicolon';

我们的条件语句是:

my ( @arr5 , @arr6 );
if (index($str2, '?') != -1) {
@arr5 = split /j/,$str2;
@arr6 = split /k/,$str4;
} else {
@arr5 = split /-/,$str2;
@arr6 = split /;/,$str4;
}
print "array 5[0] is: ", $arr5[0], "\n";
print "array 5[1] is: ", $arr5[1], "\n";
print "array 6[0] is: ", $arr6[0], "\n";
print "array 6[1] is: ", $arr6[1], "\n";

我们的输出如下:

array 5[0] is: This string has two sentences 
array 5[1] is: A dash separates them
array 6[0] is: This string has different punctuation
array 6[1] is: a semicolon

这是我卡住的地方:

现在,考虑到所有这些,您似乎应该能够将以上所有内容组合为一行三元运算符。 如前所述,我们可以在三元组中声明多个变量。 因此,似乎我们应该能够完全执行上面的代码,但是使用三元代码而不是if else块。 像这样:

my ( @arr3 , @arr4 ) = (index($str2, '-') != -1) ? split /-/,$str2, split /;/, $str4 : split /:/,$str2, split /;/, $str4;

基本上,这是在三元条件语句的每个部分中设置两个数组的值的方式完全相同。 但是,如果我们打印结果:

print "array 3[0] is: ", $arr3[0], "\n";
print "array 3[1] is: ", $arr3[1], "\n";
print "array 4[0] is: ", $arr4[0], "\n";
print "array 4[1] is: ", $arr4[1], "\n";

我们得到以下输出:

array 3[0] is: This string has two sentences 
array 3[1] is: A dash separates them
array 4[0] is:
array 4[1] is:

即使将两个评估块都放在括号中,其结果仍然相同。 我的结论是,每个拆分函数中的附加逗号都会抛出三进制条件块,而不会捕获第二组。 但是,这只是一个猜测,因为我没有在其他地方找到答案。

如果有人有任何见识,我将不胜感激。 并不是说在任何现实情况下这都是必要的。 但这让我感到烦恼,似乎它应该可以工作,但是不起作用,我也不知道为什么!

From: https://hackernoon.com/ternary-trouble-in-perl-fc138b345843

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值