6

コマンドラインから次のように入力を受け取るPerlアプリケーションがあります。

application --fields 1-6,8

コマンドラインでユーザーの要求に応じてフィールドを表示する必要があります。

'-'を'..'に置き換えて、配列に格納できるようにすることを考えました。

$str = "1..15,16" ;
@arr2 = ( $str ) ;
@arr = ( 1..15,16 ) ;
print "@arr\n" ;
print "@arr2\n" ;

ここでの問題は、@ arrは正常に機能しますが(本来はそうです)、@arr2では文字列全体が配列要素として展開されないことです。

エスケープシーケンスを使用してみましたが、うまくいきませんでした。

このようにできますか?

4

6 に答える 6

26

これがユーザー入力である場合、セキュリティ上の懸念がある場合は文字列 eval を使用しないでください。

代わりにNumber::Rangeを使ってみてください:

 use Number::Range;

 $str = "1..15,16" ;
 @arr2 = Number::Range->new( $str )->range;
 print for @arr2;

無効な範囲で死ぬのを避けるには、次のようにします。

 eval { @arr2 = Number::Range->new( $str )->range; 1 } or your_error_handling

.. の代わりに - を使用するSet::IntSpanもあります。

 use Set::IntSpan;

 $str = "1-15,16";
 @arr2 = Set::IntSpan->new( $str )->elements;

ただし、範囲が整然としていて、重複していないことが必要です (.newsrc ファイルで使用するために作成されたものです。また、要素メソッドが鳴る無限の範囲 (文字列が開始する場所 -数値または数値で終了する場所) も許可します。

于 2009-06-19T08:13:41.007 に答える
1

Bit::Vector::to_Enum の出力を処理する際にも同じ問題がありました。私はそれを解決しました:

$range_string =~ s/\b(\d+)-(\d+)\b/expand_range($1,$2)/eg;

それから私のファイルにも:

sub expand_range
{
    return join(",",($_[0] .. $_[1]));
}

したがって、「1,3,5-7,9,12-15」は「1,3,5,6,7,9,12,13,14,15」になります。

その拡張機能を s/// の 2 番目の部分に入れようと一生懸命努力したので、その余分な機能は必要ありませんが、機能させることができませんでした。Number::Range は機能しますが、この方法では、些細なことのために別のモジュールをプルする必要がないため、これが気に入っています。

于 2011-12-21T01:15:42.670 に答える
1

あなたが考えているのは@arr2 = eval($str); 、あなたが入力してそれを評価しているので、注意する必要があります。あなたはおそらく@arr2 = eval($str) if ($str =~ m/^[0-9.,]+$/)

PS Number::Range パッケージについては知りませんでしたが、素晴らしいです。番号::範囲

于 2009-06-19T07:46:00.940 に答える
0
@arr2 = ( eval $str ) ;

動作しますが、もちろんeval()には十分注意する必要があります。

于 2009-06-19T07:37:57.540 に答える
0

あなたは評価を使用することができます:

$str = "1..15,16" ;
@arr2 = ( eval $str ) ;
@arr = ( 1..15,16 ) ;
print "@arr\n" ;
print "@arr2\n" ;

これがユーザー入力である場合は、最初に入力文字列に対して何らかの検証を行い、危険なものが入力されていないことを確認する必要があります。

于 2009-06-19T07:39:17.787 に答える
-2

分割を使用する:

@parts = split(/\,/, $fields);

print $parts[0];
1-6
print $parts[1];
8

'、'を含む文字列を配列に入れて、それが要素に変わることを期待することはできません(ただし、Perlの黒魔術を使用する場合を除きますが、ここでは説明しません)。

しかし、正規表現と分割はあなたの友達です。

于 2009-06-19T07:35:05.533 に答える