我使用printf来格式化输出。但我无法正确地格式化它。有人能帮我指出下面这段代码有什么问题吗?
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?
}发布于 2015-04-08 04:36:31
谢谢各位我找到了答案。首先,我使用了tripleee建议的严格警告,这导致了另一个错误,如下所示:
参数“{4c}.”在main3.pl第44行的sprintf中不是数字。
稍后,我首先使用sprintf转换输出t字符串,并将%d更改为%s。
最后看起来是这样的:
my $string = sprintf ("%22s %18s",$_->[0],$_->[1]); # store it first
print $string; #Now prints fine发布于 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技巧应该会迫使它重新评估它。
https://stackoverflow.com/questions/29505729
复制相似问题