問題は、この式が次の値を返す 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