Объясните: почему корректно отрабатывает код:
#!/usr/bin/perl
@massiv_digit=("13","77K","22M");
$limit=scalar @massiv_digit;
while ($i < $limit)
{if ($massiv_digit[$i]=~m/K$/)
{
$massiv_digit[$i]=$massiv_digit[$i]*1000;
}
if ($massiv_digit[$i]=~m/M$/)
{
$massiv_digit[$i]=$massiv_digit[$i]*1000000;
}
$massiv_digit_all=$massiv_digit_all+$massiv_digit[$i];
$i++;
}print "\n";
print "$massiv_digit_all\n";В итоге суммируется 13+77000+22000000
и получается 22077013
Написал я, но честно говоря сам не пойму, почему члены массива воспринимаются как числа.
>Объясните: почему корректно отрабатывает код:
>#!/usr/bin/perl
>@massiv_digit=("13","77K","22M");
>$limit=scalar @massiv_digit;
>while ($i < $limit)
>{
>
>if ($massiv_digit[$i]=~m/K$/)
>{
>$massiv_digit[$i]=$massiv_digit[$i]*1000;
>}
>if ($massiv_digit[$i]=~m/M$/)
>{
>$massiv_digit[$i]=$massiv_digit[$i]*1000000;
>}
>$massiv_digit_all=$massiv_digit_all+$massiv_digit[$i];
>$i++;
>}
>
>print "\n";
>print "$massiv_digit_all\n";
>
>В итоге суммируется 13+77000+22000000
>и получается 22077013
>Написал я, но честно говоря сам не пойму, почему члены массива воспринимаются
>как числа.
Видишь ли. В этом Сила и Мощь перла - контексты.
Одна и та же переменная в разных контекстах будет трактоваться по разному.
>Видишь ли. В этом Сила и Мощь перла - контексты.
>Одна и та же переменная в разных контекстах будет трактоваться по разному.if ($massiv_digit[$i]=~m/M$/)
$massiv_digit[$i] после этого становится числом судя по-всему ?
>if ($massiv_digit[$i]=~m/M$/)
>$massiv_digit[$i] после этого становится числом судя по-всему ?
Переменная трактуется как число, если к ней обратиться как к числу, например применив арифметический оператор.
>Написал я, но честно говоря сам не пойму, почему члены массива воспринимаются
>как числа.Для арифметики Perl число не обязательно должно оканчиваться на $, допустим любой символ \D. В зависимости от контекста даже 9.1 может оказаться целым числом 9.
А код выше я бы переписал так -
my %subst = ( 'K' => '000', 'M' => '000000', 'T' => '000000000', );
my $subst = join ('|', keys %substitute);map { s/$subst/$subst{$1}/; $massiv_digit_all += $_; } @massiv_digit
Спасибо друзья, все понятно.