• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Perl中的三重故障

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

有一天,我在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人参与评论

请发表评论

全部评论

专题导读
上一篇:
grep、sed、awk、perl等对正则表达式的支持的差别发布时间:2022-07-22
下一篇:
在Windows中学习Perl发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap