Я думаю, что ваша копия Perl должна быть сломана, это из версии CygWin (5.10):
pax$ perl -e 'printf("%011d\n", 99999999999);'
99999999999
pax$ perl -v
This is perl, v5.10.0 built for cygwin-thread-multi-64int
(with 6 registered patches, see perl -V for more detail)
Copyright 1987-2007, Larry Wall
Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.
Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl". If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.
Какую версию вы используете (вывод perl -v
)?
Возможно, вам придется получить 64-битную версию Perl [и, возможно, новую 64-битную производственную машину] (обратите внимание на "cygwin-thread-multi-64int"
в моем выводе). Это, по крайней мере, избавит от необходимости менять код.
Я утверждаю это на том основании, что вы не хотите сильно менять код (т. е. боитесь что-то сломать). Решение с новым оборудованием, хотя и немного дорогое, почти наверняка не потребует от вас изменения программного обеспечения вообще. Это зависит от ваших приоритетов.
Другая возможность состоит в том, что сам Perl может правильно хранить число, но просто отображать его неправильно из-за printf()
ошибки. В этом случае вы можете попробовать:
$million = 1000000;
$bignum = 99999999999;
$firstbit = int($bignum / $million);
$secondbit = $bignum - $firstbit * million;
printf ("%d%06d\n",$firstbit,$secondbit);
Поместите это в функцию и вызовите функцию, чтобы вернуть строку, например:
sub big_honkin_number($) {
$million = 1_000_000;
$bignum = shift;
$firstbit = int($bignum / $million);
$secondbit = $bignum - $firstbit * $million;
return sprintf("%d%06d\n", $firstbit, $secondbit);
}
printf ("%s", big_honkin_number (99_999_999_999));
Обратите внимание, что я тестировал это, но на 64-битной платформе — вам нужно будет провести собственный тест на 32-битной, но вы можете использовать любой коэффициент масштабирования (включая более двух сегментов, если это необходимо).
Обновление: этот big_honkin_number()
трюк отлично работает на 32-битном Perl, так что похоже, что это это просто printf()
функции, которые забивают вас:
pax@pax-desktop:~$ perl -v
This is perl, v5.8.8 built for i486-linux-gnu-thread-multi
Copyright 1987-2006, Larry Wall
Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.
Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl". If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.
pax@pax-desktop:~$ perl qq.pl
99999999999
person
paxdiablo
schedule
06.05.2009