#perl #modulus
#perl #модуль
Вопрос:
Я использую так,
$a = "002c459f";
$b = $a000;
$c = int($a/10000);
print $b; #prints 0
print $c; #prints 2
Я хочу
$ b = 459f;
$ c = 002c;
Может кто-нибудь подсказать, как я это получу?
Ответ №1:
Если бы вы использовали предупреждения, вы бы получили предупреждающее сообщение, указывающее на проблему.
Поскольку ваш 8-разрядный ввод уже отформатирован как простая шестнадцатеричная строка, вы можете просто использовать substr:
use warnings;
use strict;
my $x = '002c459f';
my $y = substr $x, 0, 4;
my $z = substr $x, 4, 4;
print "z=$z, y=$yn";
Вывод:
z = 459f, y = 002c
Рекомендуется также использовать strict . Я изменил имена ваших переменных с тех пор a
, как и b
являются специальными переменными в Perl.
Ответ №2:
Вы всегда должны использовать use strict; use warnings;
! Это сказало бы вам, что 002c459f
это не число. (Это шестнадцатеричное представление числа.) Таким образом, вы не можете использовать деление перед первым преобразованием его в число. Вы также использовали неправильный делитель ( 10000
вместо 0x10000
).
my $a_num = hex($a_hex);
my $b_num = $a_num % 0x10000; # More common: my $b_num = $a_num amp; 0xFFFF;
my $c_num = int( $a_num / 0x10000 ); # More common: my $c_num = $a_num >> 16
my $b_hex = sprintf("x", $b_num);
my $c_hex = sprintf("x", $c_num);
Но если у вас ровно восемь символов, вы можете использовать следующее вместо:
my ($c, $b) = unpack('a4 a4', $a);
Примечание: вам следует избегать использования $a
and $b
, так как это может помешать работе с sort
и некоторыми подразделениями.
Ответ №3:
Входные данные представляют собой шестнадцатеричную строку, регулярное выражение может быть применено для разделения строки на 4 символа в массив.
На этом этапе вы можете использовать результат в виде строк, или вы можете использовать hex()
для преобразования шестнадцатеричного строкового представления во внутреннее цифровое представление perl.
use strict;
use warnings;
use feature 'say';
my $a = "002c459f"; # value is a string
my($b,$c) = $a =~ /([da-f]{4})/gi;
say "0x$b 0x$ctstrings"; # values are strings
$b = hex($b); # convert to digit
$c = hex($c); # convert to digit
printf "0xx 0xxtdigitsn", $b, $c;
Вывод
0x002c 0x459f strings
0x002c 0x459f digits
Комментарии:
1. Зачем преобразовывать из шестнадцатеричного только для немедленного преобразования в шестнадцатеричный? Код неясен.
2. @ikegami — Намерения OP неясны из его вопроса, нужна ли ему строка или число?