首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >printf格式在perl中不起作用

printf格式在perl中不起作用
EN

Stack Overflow用户
提问于 2015-04-08 04:04:12
回答 2查看 262关注 0票数 1

我使用printf来格式化输出。但我无法正确地格式化它。有人能帮我指出下面这段代码有什么问题吗?

代码语言:javascript
复制
my $sql1 = "select col1,col2,col3 from MYTABLE order by 1";
my $sth = $dbh->prepare($sql1);
$sth->execute(); # or die $DBI::errstr;

my $resultref = $sth->fetchall_arrayref();

foreach (@$resultref) {
    print "\n $_->[0] $_->[1] $_->[2] $_->[3]"; # prints 1 row, 3 fields. Fine!
    printf ("%8d %8d %8d ", $_->[0], $_->[1], $_->[2]); # prints 0 for all... why?

  # So i tried the following but still the issue
    my $t1 = $_->[0];
    my $t2 = $_->[1];
    my $t3 = $_->[2];
    my $t4 = $_->[3];

    print "$t1,$t2"; #works
    printf "%8d %8d", $t1, $t2; # doesnt work . why?
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-08 04:36:31

谢谢各位我找到了答案。首先,我使用了tripleee建议的严格警告,这导致了另一个错误,如下所示:

参数“{4c}.”在main3.pl第44行的sprintf中不是数字。

稍后,我首先使用sprintf转换输出t字符串,并将%d更改为%s。

最后看起来是这样的:

代码语言:javascript
复制
my $string = sprintf ("%22s %18s",$_->[0],$_->[1]); # store it first
print $string;   #Now prints fine
票数 1
EN

Stack Overflow用户

发布于 2015-04-08 04:13:57

不知道您使用的是哪个DBH,我猜是列作为字符串返回,Perl甚至没有意识到它有一个数字。你试过这样的东西吗:printf ("%8d %8d %8d ",0+$_->[0], 0+$_->[1], 0+$_->[2]);

至于为什么,您可以查看Scalar::Utils来询问Perl它认为标量中包含了什么。正如Perl扩展的方式一样,在Perl中显示的数据可以是粗略的。我的猜测是Perl会认为:标量::Util::isdual($_->)将返回为false。但是,add 0技巧应该会迫使它重新评估它。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29505729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档