初学者的问题,关于格式化输出

初学者的问题,关于格式化输出

根据关键字(可能多个,且有顺序)对一个文本的每一行进行匹配,凡是符合的将其写入一个文件
格式是所有关键字对齐(我的理解是通过加入空格)
例如,关键字是 not until,那么输出应该是
XXXX  not .......   until
....      not  ......   until
..        not      x   until
我是初学者,基本是根据C的思想写的,只是在匹配的时候用了正则表达式。
问题出在输出上,有没有什么简单的方法实现输出的格式呢?

我的想法是通过pos定位出每个关键字的位置,然后跳出最大的距离,在进行补空格,天啊,太麻烦了,如果这样还不如用C呢,一点都体现不出perl的思想。期待高手指点。

可以用sprintf输出。

再复杂的可以用Template-Toolkit。
不是太清晰
如果要加空格,可以这样
$str='abc';
print ' 'x(20-length($str)),$str;
匹配符合条件的行时, 顺便记下各个数据字段的最大宽度.
然后用正则替换时, 加上对应宽度即可.

比如:
my $width_a = 10;
my $width_b = 11;

for (@lines) {
    s/(.*)not(.*)until/sprintf("%-${width_a}s%s%-${width_b}s%s", $1, 'not', $2, 'until')/e;
}
perldoc perlform
search.cpan.org 找 Perl6::Form 更强大
5.10 的 format 也有所改进


QUOTE:
原帖由 Lonki 于 2007-12-2 22:56 发表
匹配符合条件的行时, 顺便记下各个数据字段的最大宽度.
然后用正则替换时, 加上对应宽度即可.

比如:
my $width_a = 10;
my $width_b = 11;

for (@lines) {
    s/(.*)not(.*)until/sprintf("%-${widt ...

谢谢,方法学习了,不过我的这个关键字的数目是不确定的,我再研究研究sprintf

现在已经用最笨的方法基本实现功能呢,也是提前把每个关键字前的最大距离保存到hash表里了,呵呵
# 可以这样试试...

use strict;
use warnings;
use Data::Dumper;

my @lines = (
    'xx not xxx until xxxx except',
    'xxx not xxxx until xxxxx except',
    'xxxx not xxxxx until xxxxxx except',
);

my %keyWidth = (
    1 => { -key => 'not',     -width => 0 },
    2 => { -key => 'until',   -width => 0 },
    3 => { -key => 'except',  -width => 0 },
);

for my $line (@lines) {
    for my $keyId (1 .. scalar keys %keyWidth) {
        my $key   = $keyWidth{$keyId}->{-key};
        my $width = $keyWidth{$keyId}->{-width};
        
        if ( ($line =~ /\G(.*?)$key/g) && (length($1) > $width) ) {
            $keyWidth{$keyId}->{-width} = length $1;
        }
    }
}

print Dumper(\%keyWidth);
请问楼上,使用Data::Dumper这个模块有什么具体的作用?
纯粹输出数据, 观察方便.