我正在尝试使用作为命令行参数提供的字符串作为 Perl 脚本中 sprintf 语句中的格式说明符,例如命令行上的
myscr.pl -fmt="%.2f\t%.1f\n"
。在脚本中,我在某个地方 (undef,$fmt)=split(/=/)
来提取格式字符串,然后按如下方式使用它: $d=sprintf($fmt,$l[$i],$l[$j])
在某个循环中。这不太有效,结果如下所示:
2.32\t375.8\n2.37\t386.3\n
即,制表符和换行符格式化程序将被忽略并被视为普通字母,但位数会被正确处理。另一方面,我还有一个默认的
$fmt="%.3f\t%.3f\n"
,以防没有提供选项 -fmt
,并且在相同的 sprintf
语句中生成正确的格式:
2.323 375.817
2.372 386.275
为什么?我需要做什么才能按照我想要的方式将格式说明符作为命令行参数传递?
用作输入的字符串不会插入转义序列,例如
\n
或 \t
。当它们在您的代码中运行时,这是由 Perl 完成的。但您不需要从命令行输入它们。
假设只有两种数字格式发生变化,但制表符和换行符仍然存在,您可以这样做:
my ($x, $y) = split /,/, $input;
my $fmt = "%.$xf\t%.$yf\n"; # tab and newline are now interpolated
此外,Perl 有一个基本的变量处理可供您使用,这样您就不必自己修改。或者使用
Getopt::Long
。