1

我有这种字符串

NAME1              NAME2          DEPTNAME           POSITION
JONH MILLER        ROBERT JIM     CS                 ASST GENERAL MANAGER 

我希望输出为 name1 name2 和 position 我如何使用 split/regex/trim/etc 而不使用 CPAN 模块来做到这一点?

4

6 回答 6

6

这将取决于这些字段是固定长度字段,还是制表符分隔。最简单的(使用拆分)是如果它们是制表符分隔的。

my ($name1, $name2, $deptName, $position) = split("\t", $string);

如果它们是固定长度的,并且假设它们都是 10 个字符长,你可以像这样解析它

my ($name1, $name2, $deptName, $position) = unpack("A10 A10 A10 A10", $string);
于 2010-08-23T17:42:27.257 回答
2

如果您的输入数据以字符串数组 (@strings) 的形式出现,则此

for my $s (@strings) {
   my $output = join ' ',
                map /^\s*(.+)\s*$/ ? $1 : (),
                unpack('A19 A15 x19 A*', $s);
   print "$output\n"
}

将提取和修剪所需的信息。

姓名1 | 名称2 | 位置

约翰·米勒 | 罗伯特·吉姆 | 助理总经理

(为了更好地解释结果,我包含了“|”)

问候

rbo

于 2010-08-23T18:22:50.140 回答
1

假设字段之间的空格不是固定的,因此在两个或多个空格的基础上拆分字符串,这样它就不会像 JONH MILLER 那样将 Name 分成两部分

#!/usr/bin/perl
use strict;
use warning;
my $string = "NAME1              NAME2          DEPTNAME           POSITION
             JONH MILLER        ROBERT JIM     CS                 ASST GENERAL MANAGER ";
my @string_parts = split /\s\s+/, $string;
foreach my $test (@string_parts){  
      print"$test\n";
}
于 2010-08-23T18:32:20.537 回答
1

从那里的样本来看,一个空格属于数据,但 2 个或更多连续空格不属于。因此,您可以轻松地拆分 2 个或更多空间。我唯一要添加的是使用List::MoreUtils::mesh

use List::MoreUtils qw<mesh>;
my @names   = map { chomp; $_ } split /\s{2,}/, <$file>;
my @records = map { chomp; { mesh( @names, @{[ split /\s{2,}/ ]} ) } } <$file>;
于 2010-08-23T19:31:30.600 回答
0

要在空格上拆分:

@string_parts = split /\s{2,}/, $string;

这将拆分$string为子字符串列表。分隔符是正则表达式\s+,表示一个或多个空白字符。这包括空格、制表符和(除非我弄错了)换行符。

编辑:我看到其中一个要求不是只分割一个空间,而是分割两个或更多。我相应地修改了正则表达式。

于 2010-08-23T17:54:19.813 回答
0

考虑从命令行在 Perl 单行中使用 autosplit:

$ perl -F/\s{2,}/ -ane 'print qq/@F[0,1,3]\n/' file

one-liner 将在两个或多个连续空格上拆分并打印第一个、第二个和第四个字段,对应于 NAME1、NAME2 和 POSITION 字段。

当然,如果您只有一个空格分隔 NAME1 和 NAME2 条目,这将中断,但需要有关您的文件的更多信息,以确定最佳操作方案可能是什么。

于 2010-08-23T18:29:41.797 回答