繁体   English   中英

如何在 perl 中打印输出的最后一个值?

[英]How to print the last value of my output in perl?

我写了一个脚本,这是第一次按我的意愿工作:PI 将在下面提供我的脚本。 我唯一想做但没有成功的事情就是只打印输出的最后一个值。

use strict;
use warnings;
use feature 'say';

my $filename = '/home/Desktop/my_scripts/coordinates_based';

my $p;
my $i;
my $mikos = 0;
my $sum = 0;
my $count = 1;
my $mikos_thetika = 0;
my $mikos_arnitika = 0;
my $k = 1;
my @table = ();
my $final = 0;
my $neg = 0;
my $pos = 0;
my $size;
my $last_value = 0;

open(FH, '<', $filename) or die $!;

while (<FH>) {

    my ($n, $p, $a, $b) = split '\s+';

    chomp;
    $i =  1 if $p eq '+';
    $i = -1 if $p eq '-';

    for ($k..$n)
    {
        $mikos = $b - $a;
        if ($p eq '+')
        {
            $mikos_thetika = $mikos*1 ;
            $pos += $mikos_thetika;
        }
        else
        {
            $mikos_arnitika = $mikos*(-1);
            $neg += $mikos_arnitika;
        }

        $final = $pos + $neg;

        #chomp;
        #push(@table, $final);

        #$size = scalar @table;
        say $final;

        $k = $k + 1;
    }
}
close(FH);

脚本说明:输出计算 $b 和 $a 之间的差异,并根据 $p 分别打印其与 - 或 + 的差异。 最后打印这些差异的总和,但不是我想要的总数,而是作为前一个值与即将到来的值的总和($final)。

我试过这些:

1)  if ($k==$n) # $n is first column of my input file
    {$last_value =$table[$k];}
    say $last_value; # But it prints the same output.

2)  $size= scalar @table;
    $last_value = $table [$size];
    say $size; # prints the correct table size but not as value 
               # but as an entire sequence. For example 
               # if my table size is 5 it prints 1\n 2\n 3\n 4\n 5

3) # Also i tried the List library 
    use List::Util qw(sum);
    $last_value=sum($final);

输入文件 :

$n $p $a $b   
1 - 852 1934
2 - 2020 3108
3 + 3212 3781
4 - 3917 4162
5 - 4263 4421

我的脚本后的输出文件

-1082
-2170
-1601
-1846
-2004

期望输出

2004

你基本上有这种情况,在每次迭代结束时你输出一些东西。 你一直这样做是因为你不知道什么时候会到达最后一个元素。

while( <FH> ) {
    say $_ ** 2;
    }

不是输出一些东西,而是保存结果以供稍后输出。 当您遇到另一个元素时,请替换该值。 当输入用完时,您记住的最后一个值就是您要输出的值:

my $previous_output;
while( <FH> ) {
    $previous_output = $i ** 2;
    }

say $previous_output;

或者,您可以通过制作所有输出并仅用tail (或类似的东西)抓取最后一行来作弊:

% perl script.pl | tail -n 1

好吧,我冒昧地清理了您的代码。

请查看您是否发现以下代码片段比原始代码更易于阅读/理解。

它与您的原始代码具有相同的目的/功能,除了在程序退出之前处理完所有数据之后根据您的请求输出最终结果。

注意: zdim 使我注意到代码可以通过拆分特殊情况进行改进if ... else ... CPU 周期效率(用于清理输入数据)和关于标题跳过代码(标题可以不存在或具有不同的格式)。 虽然最初我并不打算改进代码而只是提高代码的可读性,但我认为 zdim 的建议是值得的。

注意:输入数据用next unless /\\d+ +[+-] +\\d+ +\\d+/;清理, next unless /\\d+ +[+-] +\\d+ +\\d+/; next unless /\\d+\\s+[+-]\\s+\\d+\\s+\\d+/; ——更多的是为了演示目的,可以用不同的方式实现相同的目标。 当数据字段可以用多个空格分隔时,我假设可能存在输入数据不一致的情况(用户可以调整间距以提高可读性)。 ' '\\s是完全不同的,因为首先假设只有 ' '(空格)而 '\\s' 假设 [ \\f\\n\\r\\t]。 珍珠

use strict;
use warnings;
use feature 'say';

my $filename = 'coordinates_based';    # I run code in same directory as input file

my($k,$pos,$neg,$final);               # only necessary variables for computation 

$k = 1;
$pos = $neg = 0;                       # some variables initialization

open my $fh, '<', $filename
    or die "Could not open $filename: $!";

while (<$fh>) {                             # walk through file
    next unless /\d+ +[+-] +\d+ +\d+/;      # sanitize input data
    chomp;

    my ($n, $p, $a, $b) = split;            # see split doc for special case

    for ($k..$n)
    {
        if ($p eq '+') {
            $pos += $b-$a;   # thetika  (positive)
        } else {
            $neg -= $b-$a;   # arnitika (negative)
        }

        $final = $pos + $neg;

        $k++;
    }
}

close $fh;

say $final;                            # output result of computation

输出

-2004

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM