1

問題は、与えられた入力に各数字が現れる回数を数える Perl スクリプトです。各桁の合計とすべての合計の合計を出力します。

スクリプトは次のとおりです。

#!/usr/bin/perl

my $str = '654768687698579870333';

if ($str =~ /(.*)[^a]+/) {

    my $substr = $1;
    my %counts;

    $counts{$_}++ for $substr =~ /./g;

    print "The count each digit appears is: \n";
    print "'$_' - $counts{$_}\n" foreach sort keys %counts;
    my $sum = 0;
    $sum += $counts{$_} foreach keys %counts;
    print "The sum of all the totals is $sum\n";    
}

私が得ている出力は次のとおりです。

The count each digit appears is:
'0' - 1
'3' - 2
'4' - 1
'5' - 2
'6' - 4
'7' - 4
'8' - 4
'9' - 2
The sum of all the totals is 20

しかし、私が得るはずの出力は次のとおりです。

The count each digit appears is:
'0' - 1
'3' - 3
'4' - 1
'5' - 2
'6' - 4
'7' - 4
'8' - 4
'9' - 2
The sum of all the totals is 21

どこが間違っていますか?助けてください。前もって感謝します

4

3 に答える 3

2
#! /usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;

my $numbers = "654768687698579870333";
$numbers =~ s{(\d)}{$1,}xmsg;

my %counts;
map {$counts{$_}++} split (/,/, $numbers);

print Dumper(\%counts);

出力

$VAR1 = {
      '6' => 4,
      '3' => 3,
      '7' => 4,
      '9' => 2,
      '8' => 4,
      '4' => 1,
      '0' => 1,
      '5' => 2
    };
于 2012-10-18T07:52:29.993 に答える
2

文字列全体を検査する ( ) 代わりに$str、最後の文字を除くすべてを検査します ( $substr)。

if ($str =~ /(.*)[^a]+/) {
    my $substr = $1;

    my %counts;
    $counts{$_}++ for $substr =~ /./g;

する必要があります

my %counts;
++$counts{$_} for $str =~ /[0-9]/g;
于 2012-10-18T06:20:47.910 に答える
0

解決

#!/usr/bin/perl                                             

use strict;

my $str = '654768687698579870333';
my (%counts, $sum);

while ($str =~ m/(\d)/g) {

    $counts{$1}++;
    $sum++;
}

print "The count each digit appears is: \n";
print "'$_' - $counts{$_}\n" for sort keys %counts;
print "The sum of all the totals is $sum\n";

出力

The count each digit appears is: 
'0' - 1
'3' - 3
'4' - 1
'5' - 2
'6' - 4
'7' - 4
'8' - 4
'9' - 2
The sum of all the totals is 21
于 2012-10-18T06:41:11.327 に答える