1

助けてください

以下のようなデータ行のファイルを扱っています。ご覧のとおり、データは ' |||' で 4 つに分割されているので、(分割すると) 4 つの配列になります。私が欲しいのはこれです:

  1. 最初の配列に句読点があるかどうかを確認したいのですが、ある場合は配列内の位置を覚えておいてください。
  2. 3 番目の配列の同じ位置に移動し、括弧内の数字を読み取ります。
  3. 数値の配列インデックスの値が句読点かどうかを確認します。

私の問題は、試合とその位置を思い出せなかったことです! ここで手伝ってくれませんか?

||| ||| 欧州連合によって ||| () (0) (1) (3) (2) (4) () ||| (1) (2) (4) (3) (5)
4

3 に答える 3

6

に加えてpos()、 と があり@-ます@+

#!/usr/bin/perl

use strict;
use warnings;

my $string = "foo bar baz";

if ($string =~ /(foo) (bar) (baz)/) {
    print "the whole match is between $-[0] and $+[0]\n",
        "the first match is between $-[1] and $+[1]\n",
        "the second match is between $-[2] and $+[2]\n",
        "the third match is between $-[3] and $+[3]\n";
}   
于 2009-05-16T00:36:42.883 に答える
5

このpos()関数は、試合の (終了) 位置を報告するために使用できます。例:

my $string = 'abcdefghijk';

if($string =~ /e/g)
{
  print "There is an 'e' ending at position ", pos($string), ".\n";
}

このコードは、「位置 5 で終わる 'e' があります」と出力します。(位置は 0 から始まります。) これを括弧の通常の使用法と組み合わせると、問題を解決できるはずです。

に加えて、一致する各サブパターンの開始オフセットと終了オフセットを提供するpos()特別なグローバル配列@-およびもあります。@+例:

my $string = 'foo bar baz';

if($string =~ /(foo) (bar) (baz)/)
{
  print "The whole match is between $-[0] and $+[0].\n",
        "The first match is between $-[1] and $+[1].\n",
        "The second match is between $-[2] and $+[2].\n",
        "The third match is between $-[3] and $+[3].\n";
}

( Chas. Owens に感謝します。これらについての私の記憶をジョギングしてくれましたperlreperlvar

于 2009-05-16T00:26:12.487 に答える
1

単純ではないコードで何かを行う必要がある場合は、理解しやすいように、それを個別のステップと変数に分割することをお勧めします。

したがって、最初にデータ文字列を 4 つの部分に分割します。

#The data record
my $dataRec = "útil por la unión europea , a ||| by the european union , ||| () (0) (1) (3) (2) (4) () ||| (1) (2) (4) (3) (5)";

#split it into four parts
my ($Native, $English, $data1, $data2) = split(/\|\|\|/,$dataRec);

#Store the position of the punctuation mark
my $puncPos = index($Native, ",");

#If we found the punctuation mark, parse the data
my @dataList;
my $dataValue;
if ( $puncPos != -1 )
   {
   @dataList = split(/[)( ]/,$data1);

   # use the punctuation position as the index into the array of values parsed
   $dataValue = $dataList[$puncPos];
   }

そんな感じ ...

于 2009-05-16T00:41:33.683 に答える