0

サイズを表す文字列の配列があります。

すべての形式のバリエーションのリストは次のとおりです。

  1. 2x3
  2. 3.6x5.6
  3. 6'RD

目標: 次の形式に変換します。

  1. 2フィート×3フィート
  2. 3' 6'' x 5' 6''
  3. 6' ラウンド

すべての値は現在、次のように @sizearray という配列にプッシュされています。

push(@sizearray, $data[$size_num]);

それで、

my @formattedsize = @sizearray;

foreach (@formattedsize) {

    if ($formattedsize[$_] =~ /(\d+)x(\d+)/) {

        #convert to

    if (???) {

        #???

    }

    if (???) {

        #???

    }

}

配列内の各要素を調べて、値を新しい形式で新しい配列に保存するにはどうすればよいですか?

4

1 に答える 1

1

あなたは2つの問題を解決しようとしています:

  1. 入力を解析して、「意味のある」データ、つまりジオメトリ (長方形、円形など) とパラメータ (アスペクト比、直径など) を抽出します。それを行う前に、可能性の「宇宙」を確立しなければなりません。長方形と円形だけではありませんか? これは難しい部分です。
  2. 抽出されたデータを取得し、フォーマットを正規化/標準化します。これは簡単な部分です

長方形と円形の 2 つのオプションしかないとします。Rectangular は、「x」で区切られた実数のペアによって定義されているように見えるため、その正規表現は次のようになります。

(\d+(?:\.\d+)?)\s*x\s*(\d+(?:\.\d+)?)

ここにあるのは、実数の 2 つの式です。

  • 1 つ以上の数字の後にドットと 1 つ以上の数字のオプションのグループが続く
  • オプションの空白、xさらにオプションの空白
  • 1 つ以上の数字の後にドットと 1 つ以上の数字のオプションのグループが続く

数値式を囲む外側の括弧は、正規表現エンジンが一致したものを結果で利用できるようにするキャプチャ グループです。内側の括弧(?:\.\d+)?は非キャプチャ グループ (?:パーツ) です。末尾の?量指定子 (0 または 1) を小数部分に適用できますが、個別にキャプチャすることはできません。

入力がこれと一致しない場合は、次のパターンに進み、ラウンド仕様を探します。すべての可能性について、必要に応じて繰り返します。

上記の式の場合

# assume string to be parsed is in $_
if (my ($h,$w) = /(\d+(?:\.\d+)?)\s*x\s*(\d+(?:\.\d+)?)/))
{
    printf "%s x %s\n", $h, $w;
}

私はこれをテストしていないので、タイプミスがあるかもしれません...しかし、これは一般的な考えです.

于 2013-07-21T17:39:51.623 に答える