Perl字符串%s说明符无效sprintf中日期的上下文

时间:2019-01-05 02:39:56

标签: perl printf

我接受用户输入和打印格式化的输出。

以我的格式字符串%s返回,当我提供日期时,它处于无效上下文中。由于它只是打印,所以我假设字符串足以显示日期。

这是我的代码

var initialLocation = {lat:{$rows[0]['user_lat']}, lng:{$rows[0]['user_long']}};

玩耍似乎%s在sprintf中始终具有无效上下文。 如果我愿意

use strict;
use warnings;

use Time::Piece;

print "Enter item number: ";
chomp( my $item_number = <STDIN> );

print "Enter unit price: ";
chomp( my $unit_price = <STDIN> );

print "Enter purchase date (mm/dd/yyyy): ";
chomp( my $purchase_date = <STDIN> );

my $tp = Time::Piece->strptime( $purchase_date, '%m/%d/%Y' );

print "\n";
print "Item\t Unit\t Purchase\n\t Price\t Date\n";

sprintf( "%-3d\t%.2f\t%s\n", $item_number, $unit_price, $tp );
printf("_______________________________________\n");

我得到完全相同的警告。 如何使用sprintf格式的情况打印日期?还是在Perl中有比sprintf更好的方法?

2 个答案:

答案 0 :(得分:3)

sprintf不是就地功能,也不做任何打印;它只格式化字符串。您可以print或使用其返回值执行其他操作:

print sprintf( "%-3d\t%.2f\t%s\n", $item_number, $unit_price, $tp );

或直接printf

printf "%-3d\t%.2f\t%s\n", $item_number, $unit_price, $tp;

样品运行:

Enter item number: 456
Enter unit price: 5
Enter purchase date (mm/dd/yyyy): 03/10/1986

Item     Unit    Purchase
         Price   Date
456     5.00    Mon Mar 10 00:00:00 1986
_______________________________________

答案 1 :(得分:3)

您正在使用sprintf(),请注意s

该函数不输出任何内容,但返回格式化的字符串。但是,您对返回的字符串不执行任何操作,例如将其分配给变量或将其传递给另一个函数。这就是Perl警告您的无效上下文。

也许您想要printf()(没有s)或将结果分配给变量以进行进一步处理。