如何解压字符串 - 使用 sprintf 创建 - 在 Perl 中具有固定宽度
Posted
技术标签:
【中文标题】如何解压字符串 - 使用 sprintf 创建 - 在 Perl 中具有固定宽度【英文标题】:How to unpack a string - created with sprintf - with fixed width in Perl 【发布时间】:2014-10-16 08:24:31 【问题描述】:以下行带有固定:
my $line = 'ATOM 1 P CYT B 3 42.564 -34.232 -7.330 1.00105.08 P'
使用以下 sprintf 创建。
@entr = ( 'ATOM', '1', 'P', 'CYT', 'B', '3', '42.564', '-34.232', '-7.330', '1.00', '105.08', 'P' );
print sprintf("%-6s%5d %-4s%3s %1s%4d %8.3f%8.3f%8.3f%6.2f%6.2f %2s\n",@newentr)
我想做的是反转这个过程。
即以$line
作为输入,创建看起来与@entr
完全相同的数组。
如何在 Perl 中实现这一点?
【问题讨论】:
我换行了(CYT
vs C
)。
@choroba:我更新了@entr
。
两个十进制数字直接相邻 (1.00105.08
) 不是很清楚...$line
应该是人类可读的吗?
@ialarmedalien:这正是我们需要解包的原因。该列由fixed with定义。
【参考方案1】:
您可以使用unpack,或者使用正则表达式:
# %-6s%5d %-4s%3s %1s%4d %8.3f%8.3f%8.3f%6.2f%6.2f %2s\n
my @rev_eng = unpack 'a6 a5 x2 a4 a3x1 a1 a4 x4 a8 a8 a8 a6 a6 x10 a2', $output;
my $reg = qr/^(.6) (.5) .. (.4) (...) . (.) (.4) .4 (.8) (.8) (.8) (.6) (.6) .10 (..)/x;
my @regex = $output =~ $reg;
s/^\s+|\s+$//g for @rev_eng, @regex;
在模板中,a
代表字符串,x
忽略给定的字节数(本例中为空格)。
【讨论】:
数组 Dumper 怎么会显示带有尾随空格的条目codepad.org/fu2usvIm以上是关于如何解压字符串 - 使用 sprintf 创建 - 在 Perl 中具有固定宽度的主要内容,如果未能解决你的问题,请参考以下文章