Я задал вопрос о том, что раньше не было символа (X) в Perl. У меня теперь есть рабочий код, но это не работает, где чтение файлов.Perl - Соответствие с условиями ухода и чтением файлов csv
Предположим, у меня есть 50-битный двоичный вход и база данных. Если вход согласован с данными в базе данных, я вернул бы предопределенное значение.
Предположим, что данные в базе данных 11001100100010110111110110101001000010110101111101.
Если вход 11XX11001000101101111101101010010000101101011111X1, я хотел бы сказать, что это согласованный случай, поскольку X может быть 1 или 0. Я знаю способ разделить 50 бит в 50 1 бит и сделать исключение, но я бы предпочел для обработки 50-бит вместе.
В моем коде (dontcare.pl) первая часть работает с внутренне определенными входами и базой данных. Тем не менее, я хотел бы прочитать входной файл (input_text.txt) и файл базы данных (database.txt), который содержит другую информацию и делает то же самое.
dontcare.pl:
#!/usr/bin/perl
####### 1st part, Internal string input and database
my $input = '11XX11001000101101111101101010010000101101011111X1';
(my $mask = $input) =~ tr/X01/\x00\xFF\xFF/;
(my $targ = $input) =~ tr/X/\x00/;
for my $num_bin (qw(
11001100100010110111110110101001000010110101111101
10101100100010110111110110101001000010110101111101
)) {
if (($num_bin & $mask) eq $targ) {
print "$num_bin matches\n";
} else {
print "$num_bin doesn't match\n";
}
}
####### 2nd part, Reading input and database files
print " Reading files\n";
##### Read input
my @Dinput=do{
open my $Dfh,"<","input_test.txt" or die("Cannot open an input file $!");
<$Dfh>;
};
##### Read database
open(CSV,'database.txt')||die("Cannot open db file $!");
my @Ddb;
while(<CSV>){
my @row=split(/\t/,$_);
push(@Ddb,\@row);
}
close CSV || die $!;
for (my $n=0; $n < (scalar @Dinput); $n +=1) {
for (my $i=0; $i < (scalar @Ddb); $i +=2) {
(my $Dmask = $Dinput[$n]) =~ tr/X01/\x00\xFF\xFF/;
(my $Dtarg = $Dinput[$n]) =~ tr/X/\x00/;
if (($Ddb[$i][1] & $Dmask) eq $Dtarg) {
print "$Ddb[$i][1] matched\n";
} else {
print "$Ddb[$i][1] didn't match\n";
}
}
}
input_test.txt: (входной файл, содержащий два входа)
11XX11001000101101111101101010010000101101011111X1
1000011000111101001011110111001100100101111000010X
database.txt:. (Файл базы данных имеет 50-битный двоичный в второй столбец. Другая информация также содержится в файле)
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
Я думаю, что это проблема с литьем типа. Первая часть содержит строку ввода и строку базы данных, поэтому она работает. Однако вторая часть автоматически считывает ввод и данные из файлов как целые числа. Я искал тип кастинга и понял, что в Perl нет функции кастинга (или я ошибаюсь). Пожалуйста, дайте мне знать любую идею и/или рекомендацию для решения этой проблемы.
Вкратце, я хотел сделать совпадение с условием невращения работы с файлами ввода и базы данных. Пожалуйста, дайте мне знать, если у вас есть другие способы работать с этим. (Я использовал временное изменение значения во входном файле).
Ваш вход фактически двоичным, или это ASCII строки 1 и 0? (если вы 'cat', вы получаете выше выход?) – Sobrique
Это строка. –