2

我在制作涉及链式三元条件运算符的语句时遇到了一些麻烦。

显然我可以用标准的方式编写它们,但是知道它们为什么不能正常工作会很有用。

我想做的伪代码:

如果 $feature 以 's' 结尾,则使 $group = 大写 $feature

如果 $feature 以 'y' 结尾,则在 $group = 大写 $feature 之前删除 y 并替换为 'ies'

如果 $feature 以其他任何内容结尾,则添加一个 's' 并使 $group = 大写 $feature。

我尝试过使用 c 风格的 ifs:

substr($feature,-1) eq 'y' ? $group = uc(chop($feature)).'IES'
                           : substr($feature,-1) ne 's' ? $group = uc($feature).'S'
                                                        : $group = uc($feature);

substr($feature,-1) ne 's' ? substr($feature,-1) eq 'y' ? $group = uc(chop($feature)).'IES'
                                                        : $group = uc($feature).'S'
                           : $group = uc($feature);

发生的情况是,如果我在 $feature 中有一个以 say eor结尾的字符串n,它不会找到$group = uc($feature).'S'. 我尝试更改并使用它,eq 's'但随后它S在已经以s.

任何帮助表示赞赏!

编辑:

这要归功于dan1111

$group = substr($feature,-1) ne 's' ? substr($feature,-1) eq 'y' ? uc(chop($feature)).'IES'
                                    : uc($feature).'S'
         : uc($feature);
4

2 回答 2

4

Perl 的一个怪癖是您实际上可以分配给三元运算符:

condition ? $a : $b = 2;

这分配2$a$b取决于条件是否为真。

同样,在您的代码uc($feature)中被分配给条件的不同部分,具体取决于什么是真实的。

因此,如果substr($feature,-1) ne 's'在您的代码中为 true,Perl 会执行以下操作:

($group = uc($feature).'S') = uc($feature);

分配uc($feature)$group.

我觉得 Perl 的这个特性很傻,也有些遗憾。尽管如此,您确实不应该将三元运算符用于控制流。仅用于简单检查:

print $result == 1 ? 'yes' : 'no';

您当然不应该将多个三元运算符组合在一起,因为它非常令人困惑。这有什么问题?

if (substr($feature,-1) eq 'y')
{
    $group = uc(chop($feature)).'IES';
}
elsif (substr($feature,-1) ne 's')
{
    $group = uc($feature).'S';
}
else
{
    $group = uc($feature);
}
于 2013-03-07T11:48:56.180 回答
4

这是您当前问题的解决方案:

#!/usr/bin/env perl

use strict;
use warnings;

use feature 'say';

say make_group($_) for qw( curly status color );

=for specification

if $feature ends with 's', make $group = upper case $feature

if $feature ends with 'y', remove the y & replace with 'ies' before making $group = upper case $feature

if $feature ends with anything else, add an 's' and make $group = upper case $feature.

=cut

sub make_group {
    my ($feature) = @_;
    my $last = substr($feature, -1);

    my $group = $last eq 's' ? uc($feature)
              : $last eq 'y' ? do { chop($feature); uc("${feature}ies") }
              : uc("${feature}s")
    ;

    return $group;
}

__END__

但是,我会使用Lingua::EN::Inflect

#!/usr/bin/env perl

use strict;
use warnings;

use feature 'say';
use Lingua::EN::Inflect 'PL_N';

say uc(PL_N $_) for qw( curly status color );

__END__
于 2013-03-07T12:04:25.603 回答