免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2118 | 回复: 8
打印 上一主题 下一主题

初学者的问题,关于格式化输出 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-02 15:54 |只看该作者 |倒序浏览
根据关键字(可能多个,且有顺序)对一个文本的每一行进行匹配,凡是符合的将其写入一个文件
格式是所有关键字对齐(我的理解是通过加入空格)
例如,关键字是 not until,那么输出应该是
XXXX  not .......   until
....      not  ......   until
..        not      x   until
我是初学者,基本是根据C的思想写的,只是在匹配的时候用了正则表达式。
问题出在输出上,有没有什么简单的方法实现输出的格式呢?

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

[ 本帖最后由 ptwcj 于 2007-12-2 16:51 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-12-02 16:53 |只看该作者
可以用sprintf输出。

再复杂的可以用Template-Toolkit。

论坛徽章:
4
处女座
日期:2013-09-01 19:30:07双鱼座
日期:2013-09-28 10:58:45双子座
日期:2014-05-23 08:32:0215-16赛季CBA联赛之八一
日期:2016-04-12 19:55:42
3 [报告]
发表于 2007-12-02 17:17 |只看该作者
不是太清晰
如果要加空格,可以这样
$str='abc';
print ' 'x(20-length($str)),$str;

论坛徽章:
0
4 [报告]
发表于 2007-12-02 22:56 |只看该作者
匹配符合条件的行时, 顺便记下各个数据字段的最大宽度.
然后用正则替换时, 加上对应宽度即可.

比如:
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;
}

论坛徽章:
0
5 [报告]
发表于 2007-12-02 23:17 |只看该作者
perldoc perlform
search.cpan.org 找 Perl6::Form 更强大
5.10 的 format 也有所改进

论坛徽章:
0
6 [报告]
发表于 2007-12-03 00:09 |只看该作者
原帖由 Lonki 于 2007-12-2 22:56 发表
匹配符合条件的行时, 顺便记下各个数据字段的最大宽度.
然后用正则替换时, 加上对应宽度即可.

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

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

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

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

论坛徽章:
0
7 [报告]
发表于 2007-12-03 15:30 |只看该作者
# 可以这样试试...

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

论坛徽章:
0
8 [报告]
发表于 2007-12-04 16:26 |只看该作者
请问楼上,使用Data::Dumper这个模块有什么具体的作用?

论坛徽章:
0
9 [报告]
发表于 2007-12-04 18:06 |只看该作者
纯粹输出数据, 观察方便.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP