Как найти количество гласных в строке, используя Perl - PullRequest
2 голосов
/ 05 февраля 2020
sub Solution{
    my $n=$_[0];
    my $m=lc $_[1];
    my @chars=split("",$m);

    my $result=0;

    my @vowels=("a","e","i","o","u");


    #OUTPUT [uncomment & modify if required]
    for(my $i=0;$i<$n;$i=$i+1){
        for(my $j=0;$j<5;$j=$j+1){
            if($chars[$i]==$vowels[$j]){
                $result=$result+1;
                last;
            }

        }

    }

    print $result;
}



#INPUT [uncomment & modify if required]
my $n=<STDIN>;chomp($n);
my $m=<STDIN>;chomp($m);


Solution($n,$m);

Итак, я написал это решение, чтобы найти количество гласных в строке. $n - длина строки, $m - строка. Однако для ввода 3 nam я всегда получаю ввод как 3.

Может ли кто-нибудь помочь мне отладить его?

Ответы [ 4 ]

4 голосов
/ 05 февраля 2020

== сравнивает числа. eq сравнивает строки. Поэтому вместо $chars[$i]==$vowels[$j] вы должны написать $chars[$i] eq $vowels[$j]. Если бы вы использовали use warnings;, что рекомендуется, вы бы получили предупреждение об этом.

И, между прочим, нет необходимости работать с дополнительными переменными для длины. Вы можете получить длину строки с length() и массива, например с scalar(). Кроме того, последний индекс массива @a может быть доступен с помощью $#a. Или вы можете использовать foreach для перебора всех элементов массива.

3 голосов
/ 05 февраля 2020

Лучшим решением является использование оператора tr, который в скалярном контексте возвращает количество замен:

perl -le 'for ( @ARGV ) { $_ = lc $_; $n = tr/aeiouy//; print "$_: $n"; }' Use Perl to count how many vowels are in each string
use: 2
perl: 1
to: 1
count: 2
how: 1
many: 2
vowels: 2
are: 2
in: 1
each: 2
string: 1

Я включил также y, который иногда является гласным, см .: https://simple.wikipedia.org/wiki/Vowel

0 голосов
/ 05 февраля 2020

Ваш код слегка изменённой формы

#!/usr/bin/env perl
#
# vim: ai:ts=4:sw=4
#

use strict;
use warnings;
use feature 'say';

my $input = get_input('Please enter sentence:');

say "Counted vowels: " . solution($input);

sub get_input {
    my $prompt = shift;
    my $input;

    say $prompt;

    $input = <STDIN>;

    chomp($input);

    return $input;
}

sub solution{
    my $str = lc shift;

    my @chars=split('',$str);

    my $count=0;
    my @vowels=qw/a e i o u/;

    map{
        my $c=$_;
        map{ $count++ if $c eq $_} @vowels;
    } @chars;

    return $count;
}
0 голосов
/ 05 февраля 2020

Позвольте мне предложить лучший подход для подсчета букв в тексте

#!/usr/bin/env perl
#
# vim: ai:ts=4:sw=4
#

use strict;
use warnings;
use feature 'say';

use Data::Dumper;

my $debug = 0;             # debug flag

my %count;
my @vowels = qw/a e i o u/;

map{
    chomp;
    my @chars = split '';
    map{ $count{$_}++ } @chars;
} <DATA>;

say Dumper(\%count) if $debug;

foreach my $vowel (@vowels) {
    say "$vowel: $count{$vowel}";
}

__DATA__
So I wrote this solution to find the number of vowels in a string. $n is the length of the string and $m is the string. However, for the input 3 nam I always get the input as 3.

Can someone help me debug it?

Вывод

a: 7
e: 18
i: 12
o: 12
u: 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...