0

私は文字列を持っていますstr a\tb\tc\td\te

最初のフィールド値aを変数に入れ、次に 2 番目のフィールド値bを他の変数に入れ、次に両方c\tdを 3 番目の変数に入れ、最後のフィールド値eを 1 つの変数に入れるようにします。

私が行った場合

my ($a,$b,$c,$d) = split(/\t/,$_,4);

$cのみc$d取得し、取得しますd\te

できます:

my ($a,$b,$c) = split(/\t/,$_,3);

その後、c取得c\td\te し、どうにかして(どのように?)最後の値を取り除き、それを取得できます$d

これを達成する方法は?

4

2 に答える 2

5

splitあなたが注文を維持しているときに良いです。このように注文を破っている場合は、少し問題があります。2つの選択肢があります。

  1. に従って分割し\t、必要なものに参加します。
  2. 明示的にする。

最初の選択肢の例は次のとおりです。

my ($a,$b,$c1, $c2, $d) = split /\t/, $_;
my $c = "$c1\t$c2";

2番目の選択肢の例は次のとおりです。

my ($a, $b, $c, $d) = (/(.*?)\t(.*?)\t(.*?\t.*?)\t(.*?)/;

括弧の各セットは、必要なものを正確にキャプチャします。の後に欲張りでない修飾子(?)を使用*すると、括弧がキャプチャされないことが保証されます\t


編集:目的が任意の数の変数を持つことである場合は、配列を使用するのが最善です:

my @x = split /\t/, $_;

my $a = $x[0];
my $b = $x[1];
my $c = join "\t", @x[2..($#x-1)];
my $d = $x[-1];
于 2011-11-28T10:30:18.533 に答える
1

負の先読みアサーションで正規表現を使用できます。例:

my @fields = split /\t(?!d)/, $string;
于 2011-11-28T10:30:50.307 に答える