1

私はこの種の文字列を持っています

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

出力を name1 name2 および position にしたいのですが、CPAN モジュールを使用せずに、split/regex/trim/etc を使用してどのように行うことができますか?

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"
}

必要な情報を抽出してトリミングします。

NAME1 | NAME2 | 位置

ジョン・ミラー | ロバート・ジム | アシスタントゼネラルマネージャー

(「|」は、結果をよりよく説明するために私が含めたものです)

よろしく

rbo

于 2010-08-23T18:22:50.140 に答える
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 に答える
1

フィールド間のスペースが固定されていないと仮定して、2 つ以上のスペースに基づいて文字列を分割し、JONH MILLER のように Name が 2 つの部分に分割されないようにします

#!/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 に答える
0

空白で分割するには:

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

$stringこれは部分文字列のリストに分割されます。セパレータは正規表現で、 1 つ以上の空白文字\s+を意味します。これには、スペース、タブ、および (私が間違っていない限り) 改行が含まれます。

編集:要件の1つは、1つのスペースだけで分割するのではなく、2つ以上に分割することです. それに応じて正規表現を変更しました。

于 2010-08-23T17:54:19.813 に答える
0

コマンド ラインから Perl ワンライナーで autosplit を使用することを検討してください。

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

ワンライナーは、2 つ以上の連続するスペースで分割され、NAME1、NAME2、および POSITION フィールドに対応する 1 番目、2 番目、および 4 番目のフィールドを出力します。

もちろん、NAME1 と NAME2 のエントリを区切るスペースが 1 つしかない場合、これは壊れますが、最適なアクション コースを確認するには、ファイルに関するより多くの情報が必要です。

于 2010-08-23T18:29:41.797 に答える