/ / Как мога да разделям една дума на съставните й букви? - perl

Как мога да разделям една дума на съставните й букви? - perl

Работя с Perl и имам масив само с една дума:

@example = ("helloword")

Искам да генерирам друг масив, в който всеки елемент е буква от думата:

@example2 = ("h", "e", "l"...)

Трябва да направя това, защото трябва да преброя броя "h", "e" ... Как мога да направя това?

Отговори:

5 за отговор № 1

За да прецените колко пъти е възникнала буква в низ,

print "helloword" =~ tr/h//; # for "h" letter

в противен случай можете да разделите низ и да зададете списък на масив,

my @example2 = split //, $example[0];

3 за отговор № 2

Аз не схващам напълно какво точно трябва да разчитате, но може би можете да вземете парчета от този пример, който използва хеш за съхраняване на буквите и броя на всеки ...

use warnings;
use strict;

my @array = "helloworld";

my %letters;
$letters{$_}++ for split //, $array[0];

my $total;

while (my ($k, $v) = each %letters){
$total += $v;
print "$k: $vn";
}
print "Total letters in string: $totaln",

изход:

    w: 1
d: 1
l: 3
o: 2
e: 1
r: 1
h: 1
Total letters in string: 10

2 за отговор № 3

Опитайте да използвате този код, който се намира тук: http://www.comp.leeds.ac.uk/Perl/split.html

@chars = split(//, $word);


-1 за отговор № 4

Разбира се, можете да използвате split(//,"helloworld"), но това не е толкова ефективно, колкото разопаковането. Изчисляването на шаблона за осигуряване на разопаковане може да бъде малко стръмен, но това трябва да работи за вас: unpack("(A)*","helloworld"), Например:

perl -e "print(join("n",unpack("(A)*","helloworld")),"n")"
h
e
l
l
o
w
o
r
l
d

За да пресметнете броя на буквите, можете да приемете, че всеки знак на "дума", на която разделихте низовата структура, е буква и просто преценявате списъка в скаларен контекст (или използвайте "дължина"), напр. print(scalar(@letters),"n"); или print(length(@letters),"n"), ИЛИ бихте могли да създадете променлива за преброяване и да я увеличите в карта, когато съответства на шаблон на писмото, например:

my $cnt = 0;
foreach(@chars){$cnt++ if(/w/)}
print("$cntn");

Или можете да използвате същата оценка на списък в скаларен трик с grep:

print(scalar(grep {/w/} @chars),"n");

Разбира се, в Perl, други начини да го направите.

РЕДАКТИРАНЕ: Ако не съм интерпретирал въпроса и искате да знаете колко от всяко писмо има в низа, това би трябвало да е достатъчно:

$cnt = 0;
foreach(unpack("(A)*","helloworld")))
{
next unless(/w/);
$hash->{$_}->{ORD} = $cnt++ unless(exists($hash->{$_}));
$hash->{$_}->{CNT}++;
}

foreach(sort {$hash->{$a}->{ORD} <=> $hash->{$b}->{ORD}}
keys(%$hash))
{print("$_t$hash->{$_}->{CNT}n")}

Това решение има предимството да държи уникалните букви в реда на тяхното първо появяване в думата, в която са намерени.