0

それで、正規表現を使って黒魔術を発明することができました。いくつかのコマンド ライン引数を解析しようとしていますtest[somethinginhere]。「somethinginhere」が実行するテストの名前である形式の任意の引数を受け入れたいと考えています。

これがコードの外観です。その後にブール値を使用して実際に機能を実行するコードがありますが、これは引数を処理する部分です。

ARGV.each do |arg|
    case arg.downcase
        when "help"
            @help = true
        when "install"
            @install = true
        when "deploy"
            @deploy = true
        when "configure"
            @configure = true
        when /^test\[([a-z]+)\]$/
            @test << arg.downcase[/^test\[([a-z]+)\]$/,1]
        else
            @usage = true
    end

end

ここで黒魔術の出番です。このプログラムは、小文字の 's' を含まないテスト名に対して適切に実行されます。以下が通過します。

$ ./AutoTest.rb test[a]
Running Test "ATest"

$ ./AutoTest.rb test[b]
Running Test "BTest"

$ ./AutoTest.rb test[anything]
Running Test "AnythingTest"

以下は失敗します。

$ ./AutoTest.rb test[s]

Usage: AutoTest [help|install|deploy|configure|test[*]]

しかし、これは合格します:

$ ./AutoTest.rb test[S]

Running Test "STest"

実際、小文字の s を含むものはすべて失敗します。

$ ./AutoTest.rb test[user]

Usage: AutoTest [help|install|deploy|configure|test[*]]

その s が大文字でない限り:

$ ./AutoTest.rb test[uSer]

Running Test "UserTest"

私が到達できる唯一の結論は、この正規表現は黒魔術の秘密を利用しており、この時点で非常に強力になり、HTML を単独で解析できるようになっているということです。

しかし、真剣に、ここで何が起こっているのですか?

4

2 に答える 2

3

小文字の s を含む括弧は、bash では特別な意味を持ちます。私は次のことを行うことでこれを発見しました:

$ echo test[S]
test[S]

$echo test[s]
tests

これは、括弧内の任意の場所に適用されます

$echo test[user]
tests

$echo test[uSer]
test[uSer]

この黒魔術がどこから来ているのかはまだわかりませんが、私の問題の解決策は、ブラケットをもう使用しないことです.

于 2012-07-13T18:32:31.940 に答える
1

これを試して:

./AutoTest.rb "テスト[ユーザー]"

于 2012-07-13T18:34:54.750 に答える