簡體   English   中英

perl中十六進制值的總和

[英]Sum of hex values in perl

我正在嘗試輸入2個ascii文件並將它們輸出到2個十六進制文件(sym.txt,sym2.txt)中,然后執行兩個十六進制文件的總和,並將值的反轉輸出到最后一個文件(symout.txt)。我真的不明白我做錯了什么......謝謝你提前幫忙:D。

use strict;
use warnings 'all';

open my $in, "<", "f1.txt";
my $input = do { local $/; <$in> };

open my $out, ">", "sym.txt";
print $out unpack 'H*', $input;

open my $in1, "<", "f2.txt";
my $input1 = do { local $/; <$in1> };

open my $out1, ">", "sym2.txt";
print $out1 unpack 'H*', $input1;

    open(my $fh1, '<', 'sym.txt') or die $!;
    open(my $fh2, '<', 'sym2.txt') or die $!;
    open my $fh_out, '>', 'symout.txt' or die $!;

   until ( eof $fh1 or eof $fh2 ) {

    my @l1 = map hex, split '', <$fh1>;
    my @l2 = map hex, split '', <$fh2>;

    my $n = @l2 > @l1 ? @l2 : @l1;

    my @sum = map {
        no warnings 'uninitialized';
        $l1[$_] + $l2[$_];
    } 0 .. $n-1;

    @sum = map { sprintf '%X', $_ } @sum;

        print { $fh_out } reverse(@sum), "\n";
}

主要問題是你沒有關閉$out$out1 ,所以打印到這些句柄的數據仍在內存中等待刷新

最好使用詞法文件句柄(正如你所做的那樣)並添加塊,以便當句柄超出范圍時隱式關閉句柄

這是我的意思的一個例子。 請注意,我還添加了use autodie以避免必須檢查每個open調用的狀態(您應該已經完成​​但沒有!)

use strict;
use warnings 'all';
use v5.14;
use autodie;

{
    my $input = do {
        open my $in, '<', 'f1.txt';
        local $/;
        <$in>
    };

    open my $out, '>', 'sym.txt';
    print $out unpack 'H*', $input;
}

{
    my $input = do {
        open my $in, '<', 'f2.txt';
        local $/;
        <$in>
    };

    open my $out, '>', 'sym2.txt';
    print $out unpack 'H*', $input;
}

open my $fh1, '<', 'sym.txt';
open my $fh2, '<', 'sym2.txt';

until ( eof $fh1 or eof $fh2 ) {

    my @l1 = map hex, split //, <$fh1>;
    my @l2 = map hex, split //, <$fh2>;

    my $n = @l2 > @l1 ? @l2 : @l1;

    my @sum = map {
        no warnings 'uninitialized';
        $l1[$_] + $l2[$_];
    } 0 .. $n-1;

    @sum = map { sprintf '%X', $_ } @sum;

    open my $out, '>', 'symout.txt';
    print { $out } reverse(@sum), "\n";
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM