2014-09-04 157 views
0

这是一个用于编译压力数据的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 

现在,当我运行该脚本的列名不露面,而只是数字。有人可以指导我如何纠正剧本吗?

+2

您是否尝试过'打印 “级别风向风速\ n”'...? – TLP 2014-09-04 04:41:19

+0

http://www.tutorialspoint.com/perl/perl_printf.htm – lordkain 2014-09-04 04:41:24

+0

http://stackoverflow.com/questions/3328010/best-way-to-have-a-formatted-output-with-perl – lordkain 2014-09-04 04:42:09

回答

0

@Gunnerfan:您可以替换从您的代码行如下图所示

你行代码:的printf OUT “到%.0f到%.0f%.1F \ n”,$级[$ 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; 
+0

我应该放在循环中的哪一行?我按照建议做了,但恐怕我做错了,因为我有不同的结果,导致每个值的重复名称。这里显示'级别' – Gunnerfan 2014-09-04 17:46:20

+0

@Gunnerfan:我现在编辑了答案。你能检查它吗? – Praveen 2014-09-04 19:31:27

+0

@Erik:编辑你所提到的答案。谢谢!! – Praveen 2014-09-04 19:33:07

2

有几种方法在Perl中做到这一点。首先,Perl已经内置了form的能力。自3.0版以来,它一直是Perl的一部分(大约20岁)。但是,它很少使用。事实上,它很少被使用,我甚至不会试图用它来写一个例子,因为我不得不花费太多时间来重新学习它。它在那里并记录在案。

你可以尝试弄明白自己。或者,也许一些老计时器Perl程序员可能会从睡梦中醒来并帮助。 (尽管如此,如果在晚年的家中做肉饼的话,所有的赌注都没有)。

在过去的几十年中,Perl已经发生了很大的变化,而这种旧的形式位表示编写Perl程序的一种更古老的方式。它只是不是漂亮的


另一种方法可以做到这一点,是比较流行的是使用printf功能。如果您不熟悉Cprintf,那么使用起来可能有点吓人。这取决于格式化代码(与%开始的东西来指定要打印(字符串,整数,浮点数等)的东西,你想怎么这些值的格式。

幸运的是,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 

我喜欢定义我的印刷线条的格式,所以我可以调整它们以获得我想要的。这是确保您的数据线与您的标题对齐的好方法。

+0

@David_W,虽然我对它更加细腻,但是我很感激帮助。我不是一个真正的perl用户只是修改代码我必须给我想要的。谢谢 – Gunnerfan 2014-09-04 21:44:07

+0

我可以看到你的代码中已经有'printf':'printf OUT“%.0f%.0f%.1f \ n”'。没有_field width_定义。这是小数点前的数字。试试'printf OUT“%4d%9d%12.1f”\ n'。我测量了你想要的格式。 '%4d'(这是一个字符宽度的整数)和'%4.0f'(这是一个浮点数4个字符宽,没有小数位)之间没有区别。看看是否有帮助。但是,我给了你一个'printf'的链接。阅读它,玩弄它等等。'printf'用于许多编程语言,所以你可以理解它。 – 2014-09-04 22:07:51

1

好的,马特洛克不在今晚,所以这个硬皮的老Perl程序员有很多时间。

在我previous answer,我说有在Perl做形式的老办法,但我不记得如何去。那么,我花了一些时间,并为你举例说明它是如何工作的。

基本上,你需要全局变量。我想你需要我们变量,这个工作,但我可以得到我的变量工作,如果我确定他们在同一水平作为我format语句。这并不漂亮。

您可以使用水珠与_TOP附加你的头文件定义的格式。由于我在STDOUT上打印这些数据,因此我为我的数据行定义了STDOUT_TOP,为我的数据行定义了STDOUT

format必须在列的起点开始。单独的.结束格式定义。你注意到我只用一个write声明来写整个事情。它如何知道打印标题? Perl跟踪打印的行数,并在Perl认为它位于页面底部时自动写入一个换页字符和一个新标题。我假设Perl使用66行页面作为默认值。

您可以用Perl通过select设定自己的表单名称。 Perl使用$=作为页面上的行数,$-表示剩余行数。这些变量是全球,但通过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