这是我用来编译压力数据的perl代码。
$data_ct--;
mkdir "365Days", 0777 unless -d "365Days";
my $file_no = 1;
my $j = $num_levels;
for ($i = 0; $i < $data_ct; $i++) {
if ($j == $num_levels) {
close OUT;
$j = 0;
my $file = "365days/wind$file_no";
$file_no++;
open OUT, "> $file" or die "Can't open $file: $!";
}
{
$wind_direction = (270-atan2($vwind[$i], $uwind[$i])*(180/pi))%360;
}
$wind_speed = sqrt($uwind[$i]*$uwind[$i]+$vwind[$i]*$vwind[$i]);
printf OUT "%.0f %.0f %.1f\n", $level[$i], $wind_direction, $wind_speed;
$j++;
}
$file_no--;
print STDERR "Wrote out $file_no wind files.\n";
print STDERR "Done\n";
我遇到的问题是当它打印出数字时,我希望它采用这种格式
Level Wind direction windspeed
250 320 1.5
870 56 4.6
现在,当我运行脚本时,列名称不会显示而只显示数字。有人可以指导我如何纠正脚本吗?
答案 0 :(得分:2)
在Perl中有几种方法可以做到这一点。首先,Perl具有内置form能力。自3.0版本(约20年)以来,它一直是Perl的一部分。但是,它很少使用。事实上,它很少被使用,我甚至都不会尝试用它来写一个例子,因为我不得不花太多时间重新学习它。它存在并记录在案。
您可以尝试自己解决这个问题。或者,也许一些老计时器Perl程序员可能会从小睡中醒来并帮忙。 (但是如果在老年人的家里吃肉饼的话,所有的赌注都会被取消)。
Perl在过去的几十年里发展很快,而这个旧的形式位代表了一种更古老的编写Perl程序的方式。它只是漂亮。
另一种可以做到并且更受欢迎的方法是使用printf功能。如果你不熟悉那里的 C 和printf
,那么使用它可能会有点吓人。它取决于格式化代码(以%
开头的东西来指定您要打印的内容(字符串,整数,浮点数等),以及您希望这些值如何格式化
幸运的是,printf
非常有用,大多数编程语言都有自己的版本printf
。一旦你学会了,你的知识就可以转移到其他地方。对于使用格式设置变量,有一个等效的sprintf。
# Define header and line formats
my $header_fmt = "%-5.5s %-14.14s %-9.9s\n";
my $data_fmt = "%5d %14d %9.1f\n";
# Print my table header
printf $header_fmt, "Level", "Wind direction", "windspeed";
my $level = 230;
my $direction = 120;
my $speed = 32.3;
# Print my table data
printf $data_fmt, $level, $direction, $speed;
打印出来:
Level Wind direction windspeed
230 120 32.3
我喜欢一起定义打印线的格式,所以我可以调整它们以获得我想要的内容。这是确保数据线符合标题的好方法。
答案 1 :(得分:1)
好吧,马特洛克今晚没有上场,所以这位老牌Perl程序员有充足的时间。
在我的previous answer中,我说在Perl中有一种旧的表单方式,但我不记得它是怎么回事。好吧,我花了一些时间给你一个如何运作的例子。
基本上,你需要全局变量。我认为你需要我们的变量才能工作,但是如果我在与format
语句相同的级别定义它们,我可以使我的变量起作用。它不漂亮。
您可以使用GLOBS为标题添加_TOP
来定义格式。由于我在STDOUT
上打印了这些内容,因此我为我的标题定义了STDOUT_TOP
,为我的数据行定义了STDOUT
。
format
必须从列的开头开始。最后的唯一.
结束格式定义。你注意到我只用一个write
语句写了整个东西。如何打印出标题? Perl跟踪打印的行数,并在Perl认为它位于页面底部时自动写入 Form Feed 字符和新标题。我假设Perl使用66行作为默认值。
您可以在Perl中通过select
设置自己的表单名称。 Perl使用$=
作为页面上的行数,并使用$-
作为行数。这些变量是 global ,但是通过select
语句由所选格式设置。您可以使用IO::Handle来获得更好的变量命名。
#! /usr/bin/env perl
use strict;
use warnings;
use feature qw(say);
my @data = (
{
level => 250,
direction => 320,
speed => 1.5,
},
{
level => 870,
direction => 55,
speed => 4.5,
},
);
my $level;
my $direction;
my $speed;
for my $item_ref ( @data ) {
$level = $item_ref->{level};
$direction = $item_ref->{direction};
$speed = $item_ref->{speed};
write;
}
format STDOUT_TOP =
Level Wind Direction Windspeed
===== ============== =========
.
format STDOUT =
@#### @############# @#####.##
$level, $direction, $speed
.
打印:
Level Wind Direction Windspeed
===== ============== =========
250 320 1.50
870 55 4.50
答案 2 :(得分:0)
@Gunnerfan:您可以替换代码中的行,如下所示
您的代码行: printf OUT&#34;%。0f%.0f%.1f \ n&#34;,$ level [$ i],wind_direction,$ wind_speed;
替换代码:
if($i==0) {
printf OUT "\n\t%s%-20s %-10s%-12s %-20s%s\n", 'Level' , 'Wind direction' , 'windspeed');
}
printf OUT "\t%s%-20s%s %-10s%s%-12s%s %-20s\n",$level[$i],$wind_direction, $wind_speed;