Perl中的print函数

时间:2014-09-04 04:34:40

标签: perl

这是我用来编译压力数据的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

现在,当我运行脚本时,列名称不会显示而只显示数字。有人可以指导我如何纠正脚本吗?

3 个答案:

答案 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;