[问题] 用什么方法知道现在是 foreach 里的最后一个?

楼主: CindyLinz (Cindy Wang)   2014-08-29 02:40:39
程式情境类似这样:
@a 是某个外来阵列
my $counter = 0; # 记录 @a 里面有几个符合条件的
my $good = 0; # 最后的结果
for my $a (@a) {
if( $a 满足某条件 ) {
++$counter;
if( $counter==5 && $a 是 @a 的最后一项 ) {
$good = 1;
}
}
}
想问大家有没有什么有趣的写法? ^^
我试了几个, 不过感觉好像都有可挑的地方..
# 我觉得额外弄一个语法上看起来跟循环没关联的循环计数器很不开心 ><
my $i = 0;
for my $a (@a) {
++$i;
if( $a 满足某条件 ) {
++$counter;
if( $counter==5 && $i==$#a ) {
$good = 1;
}
}
}
# 我觉得里面要写成 $a[$i] 很不开心 ><
for my $i (0..$#a) {
if( $a[$i] 满足某条件 ) {
++$counter;
if( $counter==5 && $i==$#a ) {
$good = 1;
}
}
}
# 我觉得要复制 $a = $a[$i] 很不开心 ><
for my $i (0..$#a) {
my $a = $a[$i];
if( $a 满足某条件 ) {
++$counter;
if( $counter==5 && $i==$#a ) {
$good = 1;
}
}
}
# 我觉得 满足某条件 要跑两次很不开心 ><
for my $a (@a) {
if( $a 满足某条件 ) {
++$counter;
}
}
if( $counter==5 && $a[-1] 满足某条件 ) {
$good = 1;
}
# 我觉得 perl 5.12 才能用很不开心 ><
# 而且 while 里面最好不要有 last, 不然有一天会后悔..
# 不过这是这几个里面我自己觉得看起来最顺眼的一个 @@"
while( my($i, $a) = each @a ) {
if( $a 满足某条件 ) {
++$counter;
if( $counter==5 && $i==$#a ) {
$good = 1;
}
}
}
# 整理一下 scwg 的推文放上来正文 :p
$good = $a[-1] 满足某条件 && 5 == grep {$_ 满足某条件} @a;
$good = $a[-1] 满足某条件 && 4 == grep {$_ 满足某条件} @a[0..$#a-1];
for my $a (@a) {
if( $a 满足某条件 ) {
++$counter;
if( $counter==5 && \$a==\$a[-1] ) {
$good = 1;
}
}
}
作者: scwg ( )   2014-08-29 03:35:00
$good = P $a[-1] && 5 == grep {P $_} @a;$good = P($a[-1]) && 5 == grep {P $_} @a; (楼上少括号)or, $good = P($a[-1]) && 4 == grep {P $_} @a[0..$#a-1];or http://www.perlmonks.org/?node_id=630377 for moregeneral solution (e.g. \$a == \$a[-1])
作者: Neisseria (Neisseria)   2014-08-29 06:03:00
最后一个 each 的用法蛮有趣的
楼主: CindyLinz (Cindy Wang)   2014-08-29 11:51:00
喔喔! 我喜欢 \$a == \$a[-1] 这个!一楼的话就是 P 要多跑一次; 3楼的话就只是 0..$#a-1形状丑了点 ^^|
作者: AntaresStar   2014-08-29 14:16:00
原来还有取反斜线这招 (笔记)
作者: Neisseria (Neisseria)   2014-08-29 16:02:00
取反斜线是什么意思啊? 其实看不太懂耶...
作者: LiloHuang (十年一刻)   2014-08-29 16:27:00
A backslash is used to make a reference...http://goo.gl/maf5RG click to see detail
作者: Neisseria (Neisseria)   2014-09-05 11:42:00
我发现我的问题是 reference 为什么可以当 left value
作者: xatier (一切重来就好了...)   2014-09-05 12:33:00
why not it's Perl!
楼主: CindyLinz (Cindy Wang)   2014-09-05 13:51:00
这边 reference 没有被当 left value 啊, == 拿来比较而已然后 for my $a (...) 的 $a 在 perl 叫 alias 不是ref跟 C++ 类比的话像是 C++ 的 reference, C++ 的reference 也是可以取 address 的, 也是取到被 ref 的对象的 address
作者: Neisseria (Neisseria)   2014-09-05 15:03:00
的确是我没注意到是 == 不是 =
楼主: CindyLinz (Cindy Wang)   2014-09-05 20:02:00
XD

Links booklink

Contact Us: admin [ a t ] ucptt.com