【问题标题】:Perl string %s specifier void context for date in sprintfsprintf 中日期的 Perl 字符串 %s 说明符无效上下文
【发布时间】:2019-01-05 10:52:04
【问题描述】:

我正在接受用户输入并打印格式化输出。

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

这是我的代码

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");

似乎 %s 在 sprintf 中总是有一个无效的上下文。 如果我这样做了

sprintf( "%s", $tp );

我得到完全相同的警告。 我将如何在我拥有的 sprintf 格式的情况下打印日期?或者 perl 中是否有比 sprintf 更好的方法?

【问题讨论】:

  • 我没有意识到 sprintf 只是格式化没有打印。

标签: perl printf


【解决方案1】:

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
_______________________________________

【讨论】:

    【解决方案2】:

    您使用的是sprintf(),请注意s

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-20
      • 1970-01-01
      • 1970-01-01
      • 2018-10-08
      • 2011-08-19
      • 1970-01-01
      • 2017-02-02
      • 1970-01-01
      相关资源
      最近更新 更多