2

連鎖三項条件演算子を含むステートメントを作成するのに問題があります。

明らかに私はそれらを標準的な方法で書くことができますが、なぜそれらが正しく機能していないのかを知ることは有用でしょう。

私がやりたいことの擬似コード:

$featureが's'で終わる場合は、$group=大文字の$featureにします。

$featureが「y」で終わる場合は、$ group=大文字の$featureにする前に、yを削除して「ies」に置き換えます。

$ featureが他の何かで終わる場合は、「s」を追加して、$group=大文字の$featureにします。

私はc-styleifsを使ってみました:

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にsayeまたはn、で終わる文字列がある場合、が見つかりません$group = uc($feature).'S'。変更して使用してみましたが、すでに。で終わっている文字列にeq 's'余分なものが追加されています。Ss

助けていただければ幸いです。

編集:

これがおかげで機能するもの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

当面の問題の解決策は次のとおりです。

#!/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 に答える
4

Perl の特徴は、実際に三項演算子に代入できることです。

condition ? $a : $b = 2;

これは、条件が true かどうかに応じて、または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 に答える