Perl проверяет, не является ли число int неработающим

Здравствуйте, у меня есть матрица, которая содержит числа с плавающей запятой и числа int. Я хочу напечатать ее в файл таким образом, чтобы, если она не является целым числом, напечатать значение, округленное до 1 числа после числа с плавающей запятой. Ниже мой код

use Scalar::Util::Numeric qw(isint);

    for ( $i = 0 ; $i < $#matrix ; $i++ ) {
    for ( $j = 0 ; $j < $#{ $matrix[0] } ; $j++ ) {
        if (not isint $matrix[$i][$j] ) {

            printf MYFILE ("%.1f",$matrix[$i][$j]{score});
        }
        else {
            print MYFILE $matrix[$i][$j]{score}.' ';
        }
    }
    print MYFILE "\n";
}

Проблема в том, что этот вывод кода записывает все как число с плавающей запятой, даже если это целое число. Как это исправить?


person Mariya    schedule 11.09.2013    source источник
comment
Каково содержание @matrix?   -  person Toto    schedule 11.09.2013
comment
Он выводится в формате с плавающей запятой, потому что вы указали это в своем выражении printf. %f — это спецификатор формата для чисел одинарной точности с плавающей запятой.   -  person Hunter McMillen    schedule 11.09.2013
comment
Условие $i < $#matrix остановит один конец вашего массива. Вам нужно $i < @matrix или $i <= $#matrix. $#matrix — это номер последнего элемента. Кроме того, более Perlish способ написать это (и проще) for my $i (0 .. $#matrix).   -  person TLP    schedule 11.09.2013
comment
первая строка равна 0, а остальные числа с плавающей запятой, целые числа и 0   -  person Mariya    schedule 11.09.2013
comment
Я предполагаю, что `$matrix[$i][$j]` является ссылкой на хэш из-за того, что $matrix[$i][$j]{score} используется в операторе печати. Так что это никогда не int.   -  person Toto    schedule 11.09.2013
comment
@M42 M42 Это твоя проблема.   -  person TLP    schedule 11.09.2013
comment
Спасибо всем и @M42 да, это правильный ответ   -  person Mariya    schedule 11.09.2013


Ответы (1)


Вот мой комментарий --> ответ:

Я предполагаю, что $matrix[$i][$j] является ссылкой на хеш из-за того, что $matrix[$i][$j]{score} используется в операторе печати. Так что это никогда не int.

Я бы сделал (с некоторыми исправлениями):

for ( my $i = 0 ; $i < $#matrix ; $i++ ) {
#   __^^
    for ( my $j = 0 ; $j < $#{ $matrix[$i] } ; $j++ ) {
    #                                __^^
        if (not isint $matrix[$i][$j]{score} ) {
        #                          __^^^^^^^
            printf MYFILE ("%.1f",$matrix[$i][$j]{score});
        }
        else {
            print MYFILE $matrix[$i][$j]{score}.' ';
        }
    }
    print MYFILE "\n";
}

И не забывайте:

use strict;
use warnings;

во всех ваших сценариях, всегда.

person Toto    schedule 11.09.2013