Мне интересно, не символ ли в Perl символа (X).Мне не нужен символ в Perl
У меня есть 50-битный двоичный вход (на самом деле я использовал BigInt). Если вход согласован с данными в базе данных, я вернул бы предопределенное значение.
Предположим, что данные в базе данных 11001100100010110111110110101001000010110101111101.
Если вход X1001100100010110111110110101001000010110101111101, я хотел бы рассмотреть, что он соответствует случаю, потому что X может быть 1 или 0. Я знаю способ разделить 50 бит в 50 1 бит и сделать исключение, но я бы предпочитают обрабатывать 50-бит вместе.
test.pl (основной код, выглядит неаккуратно, но операция проста, прочитать файл базы данных и ввода и возвращает выходной файл, включающий в себя заранее определенного значения для согласованного случая управляет test.pl.):
#!/usr/bin/perl
use strict;
#use warnings;
use Math::BigInt;
#use Math::Gauss ':all';
#use Math::Gauss;
use 5.010;
use List::Util qw(sum);
my $Astrip="cmp_top.iop.sparc0.exu.rml.";
my $Aj=0;
my @Aoutput;
my $At=0;
my $Agen;
my @Aitems; my @Aweights;
my @Aitems_p; my @Aweights_p;
my $Ap=0;
my $Aselected_p = 0;
my $Atotal_p; my $Arand_p; my $Alimit_p;
my $Ai=0; my $Am=0; my $Ak=0;
my $Atotal; my $Arand; my $Alimit;
my $Aselected =0; my $Attemp=0; my $Ane=0; my $Asum=0;
my $Al=0; my $Attest=0;
#### change edb workload - matmul
open(CSV,'database.db')||die("Cannot open edb file $!");
my @Aedb;
while(<CSV>){
my @Arow=split(/\t/,$_);
push(@Aedb,\@Arow);
}
close CSV || die $!;
# if ($At == 0) { goto ASTART; }
my @Ainput=do{
open my $Afh,"<","test.input" or die("Cannot open an input file $!");
<$Afh>;
};
for (my $An=0; $An < (scalar @Ainput); $An +=3) {
### First loop
$Attest = 0;
for ($Ai=0; $Ai < (scalar @Aedb); $Ai +=2) {
$a = Math::BigInt->new("$Aedb[$Ai][1]");
$b = Math::BigInt->new("$Ainput[$An]");
if ($a == $b) {
$a = Math::BigInt->new("$Aedb[$Ai+1][1]");
$b = Math::BigInt->new("$Ainput[$An+1]");
if ($a == $b) { $Attemp=0;
$Attest++;
$Agen=$Ainput[$An+2];
if (not defined $Agen) { $Arand_p = rand();}
else { $Arand_p = $Agen; }
#$Attemp=0;
for ($Aj=2; $Aj < scalar @{ $Aedb[$Ai+1] }; $Aj++) {
if ($Aedb[$Ai+1][$Aj]/$Aedb[$Ai+1][2] > $Arand_p) {
$At++;
$Aedb[$Ai][$Aj] =~ s/\n//g;
$Aoutput[$At+$An/3]= $Astrip.$Aedb[$Ai][$Aj];
$Attemp++;
}
}
#$Aoutput[$An/3+$At-$Attemp]= $Attemp;
}
}
}
}
open(my $Afh2, '>', 'test.output');
print $Afh2 join("\n", @Aoutput);
close $Afh2;
database.db (файл базы данных):
0.1 11001100100010110111110110101001000010110101111101 rml_irf_old_e_cwp_e[1] rml_irf_new_e_cwp_e[1] rml_irf_swap_even_e rml_irf_old_e_cwp_e[0] rml_irf_new_e_cwp_e[0] rml_irf_swap_odd_e
0.1 11101100110010011011001101100111001001100000010011 3.923510310023e-06 3.19470818154393e-08 7.05437377900141e-10 7.05437377900141e-10 4.89200539851702e-17 5.01433479478681e-19
0.1 10000110001111010010111101110011001001011110000100 rml_irf_new_e_cwp_e[1] rml_irf_new_e_cwp_e[0]
0.1 01110111010010000000101001000001100011011100011111 0.052908822741908 2.7185508579738e-05
0.1 01001100100100001011101000011111100101111011000111 rml_irf_new_e_cwp_e[1]
0.1 00111101000100001101010111010100000111100100100101 1.09213787524617e-25
0.1 00001000011110000101010110111000000111011110011001 rml_irf_new_e_cwp_e[1] rml_irf_new_lo_cwp_e[1] rml_irf_new_lo_cwp_e[2]
0.1 01101001011110101011111011011011101100110100000101 2.28019753307221e-06 2.89026436307201e-14 2.89026436307201e-14
test.input:
11001100100010110111110110101001000010110101111101
11101100110010011011001101100111001001100000010011
тес t.output (предопределенное значение для ввода и ничего для непревзойденного случая. Я хотел бы иметь тот же результат с X10011 ...):
cmp_top.iop.sparc0.exu.rml.rml_irf_old_e_cwp_e[1]
Любая помощь приветствуется.
1) Вам не нужно 'BigInt' для 50 бит; 2) Вы можете просто заменить 'X' на' .' и проверить соответствие шаблона. –
@Sinan Ünür, я уверен, что без BigInt он не будет работать, если вы хотите использовать побитовое число, а ваш IV размер - 32 бита. (Побитовое - И намного эффективнее, чем регулярное совпадение.) – ikegami
@ikegami Если это так, два 32-битных целых числа по-прежнему будут быстрее, чем 'BigInt'. Я не входил во все пути, которые можно сделать без использования «BigInt». –