2

Julia で ismatch() 関数との一致を見つけるための非常に単純なプログラムを実行しようとしています。私のパターンが

e_pat = r".+@.+"

次に、いくつかのランダムな要素を含む input というリストを作成します。

input= ["pipo@gmail.com", 23, "trapo", "holi@gmail.com"]

ここで、一致するものがいくつ存在するかを特定し、e_pat を参照として使用してそれらを出力します。

for i in input
    println(ismatch(e_pat, i)) && println(i)
end

そのコードでは、「true」と以下に表示されるエラーが表示されます。

true

TypeError: non-boolean (Void) used in boolean context

Stacktrace:
 [1] macro expansion at ./In[27]:4 [inlined]
 [2] anonymous at ./<missing>:?
 [3] include_string(::String, ::String) at ./loading.jl:522

以下を取得するにはどうすればよいですか?

"pipo@gmail.com"
"holi@gmail.com"

ismatch() のドキュメントを読みましたが、何も役に立ちませんでした。どんな助けでも大歓迎です

4

1 に答える 1

3

問題は、この式が次の値を返す trueことです。

julia> @show ismatch(e_pat, "pipo@gmail.com");
ismatch(e_pat,"pipo@gmail.com") = true

を使用するprintlnと、単に印刷されますtrueが、次のように返さ nothingれます。

julia> @show println(ismatch(e_pat, "pipo@gmail.com"));
true
println(ismatch(e_pat,"pipo@gmail.com")) = nothing

タイプは次のVoidとおりです。

julia> typeof(nothing)
Void

Voidそして、エラーは、ブール型のコンテキストで型のオブジェクトを使用できないことを示しています( ) は、Juliaでシングルトンのように扱われるnothing単なるインスタンスです。Void

julia> nothing && true
ERROR: TypeError: non-boolean (Void) used in boolean context

これを修正した後、これも別のエラーであることに注意してください。

julia> @show ismatch(e_pat, 42);
ERROR: MethodError: no method matching ismatch(::Regex, ::Int32)
Closest candidates are:
  ismatch(::Regex, ::SubString{T<:AbstractString}) at regex.jl:151
  ismatch(::Regex, ::SubString{T<:AbstractString}, ::Integer) at regex.jl:151
  ismatch(::Regex, ::AbstractString) at regex.jl:145
  ...

これは、 にismatchはそのようなメソッドがないことを示しています。タイプの引数の組み合わせでは使用できません(Regex, Int)

String代わりに、すべてのオブジェクトがsであることを確認するために、次のようなことを行うことができます。

julia> input = string.(["pipo@gmail.com", 23, "trapo", "holi@gmail.com"])
4-element Array{String,1}:
 "pipo@gmail.com"
 "23"            
 "trapo"         
 "holi@gmail.com"

最後に、何が起こっているかをデバッグするために、関数 (結果を出力して を返す) の代わりにマクロ@show(式とその結果を出力し、最終的に結果を返す) を使用できます。println nothing

julia> for i in input
           @show(ismatch(e_pat, i)) && println(i)
       end
ismatch(e_pat,i) = true
pipo@gmail.com
ismatch(e_pat,i) = false
ismatch(e_pat,i) = false
ismatch(e_pat,i) = true
holi@gmail.com

したがって、期待される結果を印刷するには、左側を削除するだけprintlnです。

julia> for i in input
           ismatch(e_pat, i) && println(i)
       end
pipo@gmail.com
holi@gmail.com

それらを印刷する代わりに保存したい場合は、代わりに配列内包表記を使用できます。

julia> result = [str for str in input if ismatch(e_pat, str)]
2-element Array{String,1}:
 "pipo@gmail.com"
 "holi@gmail.com"

または、次のようなインデックス式:

julia> ismatch.(e_pat, input)       
4-element BitArray{1}:              
  true                              
 false                              
 false                              
  true                              

julia> result = input[ismatch.(e_pat, input)]
2-element Array{String,1}:          
 "pipo@gmail.com"                   
 "holi@gmail.com" 

そうすれば、計算を繰り返さなくても後で印刷できます。

julia> println.(result)
pipo@gmail.com
holi@gmail.com
于 2018-02-10T04:03:26.787 に答える