URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 4844
[ Назад ]

Исходное сообщение
"работа с массивом"

Отправлено XPurple , 15-Ноя-05 11:12 
Объясните: почему корректно отрабатывает код:
#!/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
Написал я, но честно говоря сам не пойму, почему члены массива воспринимаются как числа.


Содержание

Сообщения в этом обсуждении
"работа с массивом"
Отправлено mthawk , 15-Ноя-05 12:39 
>Объясните: почему корректно отрабатывает код:
>#!/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
>Написал я, но честно говоря сам не пойму, почему члены массива воспринимаются
>как числа.


Видишь ли. В этом Сила и Мощь перла - контексты.
Одна и та же переменная в разных контекстах будет трактоваться по разному.


"работа с массивом"
Отправлено XPurple , 15-Ноя-05 13:02 
>Видишь ли. В этом Сила и Мощь перла - контексты.
>Одна и та же переменная в разных контекстах будет трактоваться по разному.

if ($massiv_digit[$i]=~m/M$/)
$massiv_digit[$i] после этого становится числом судя по-всему ?


"работа с массивом"
Отправлено rWizard , 15-Ноя-05 21:07 
>if ($massiv_digit[$i]=~m/M$/)
>$massiv_digit[$i] после этого становится числом судя по-всему ?
Переменная трактуется как число, если к ней обратиться как к числу, например применив арифметический оператор.

"работа с массивом"
Отправлено ACCA , 15-Ноя-05 21:21 
>Написал я, но честно говоря сам не пойму, почему члены массива воспринимаются
>как числа.

Для арифметики 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


"работа с массивом"
Отправлено XPurple , 16-Ноя-05 06:18 
Спасибо друзья, все понятно.