【问题标题】:Sum of hex values in perlperl中的十六进制值的总和
【发布时间】:2015-12-26 23:58:20
【问题描述】:

我正在尝试输入 2 个 ascii 文件并将它们输出到 2 个十六进制文件(sym.txt,sym2.txt),然后对两个十六进制文件求和,并将值的反向输出到最后一个文件(symout.txt)中。 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";
}

【问题讨论】:

  • 你得到的结果有什么问题?
  • 我得到了 2 个具有十六进制值的文件,但我的 symout.txt 输出为空 ....

标签: perl


【解决方案1】:

主要问题是你还没有关闭$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";
}

【讨论】:

  • 原始描述含糊不清,但效果很好,除了最终输出上的换行符没有锻炼。我会竖起大拇指的。
  • @Gang:“原始描述含糊”您是指问题中OP的描述,还是我在解决方案中的叙述?
  • 鲍罗丁,你的很清楚,现在回头看,OP的描述也很清楚,只是我被自己困住了,一行一行的做。
猜你喜欢
  • 2021-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
  • 1970-01-01
  • 2010-12-19
  • 2018-07-26
  • 2013-07-04
相关资源
最近更新 更多