【发布时间】:2020-03-04 15:35:01
【问题描述】:
我编写了一个脚本,它第一次可以按我的意愿工作:P 我将在下面提供我的脚本。我唯一想做但没有成功的事情就是只打印输出的最后一个值。
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年【问题讨论】:
-
我不确定您到底需要什么,但通常在循环之后立即打印感兴趣的东西就足够了,因此您可以从最后一次迭代中获得价值。 (另外,它说“在我的脚本之后输出文件”,但您显示的代码不会打印到文件中?)
-
split有一个特殊的模式:split ' ', $str--' '(空格)表示\s+和@987654329开头的前导空格@ 已移除。非常便利!这也是它的默认设置,因此对于split ' ', $_,您可以只写split。这也有点成语,它完全适合你正在做的事情,所以my ($n, $p, $a, $b) = split;。 (注意这是有效的,因为while (...)中没有定义变量,所以$_确实分配了<FH>读取的内容。)请参阅split 的文档 -
最好使用词法文件句柄,
open my $fh, ...。比 typeglobs(FH等)更好 -
在声明数组(或哈希)时,像
my @ary = ();这样的“空”初始化只不过是my @ary;。 (在程序中需要时清空数组很有用,比如@ary = ();,但那不一样。) -
context 的概念在 Perl 中非常重要,它无处不在,而且非常流畅。示例:当您将数组分配给标量变量时,它是被分配的数组的大小,因为分配本身(
=运算符)位于 标量上下文 中。所以在$size = @table;中,@table的大小就是$size得到的。所以绝对不需要scalar(代码中的注释行)。
标签: perl