Как удалить цитаты вокруг списка в эликсире - PullRequest
0 голосов
/ 13 июня 2019

Одна из операций в Elixir возвращает меня

"[some_data1, some_data2]"

И я хочу удалить кавычки по всему списку, т.е. я хочу, чтобы мой конечный результат выглядел следующим образом

[some_data1, some_data2]

Ответы [ 2 ]

1 голос
/ 14 июня 2019

Вот один из способов:

data.txt:

[{:a, 2}, "hello", %{b: 2, c: 3}]

a.ex:

defmodule A do
  def get_term(fname) do
    {term, _binding} = Code.eval_file(fname, ".")
    term
  end
end

В iex:

iex(7)> c "a.ex"              
warning: redefining module A (current version defined in memory)
  a.ex:1
[A]

iex(8)> A.get_term "data.txt"
[{:a, 2}, "hello", %{b: 2, c: 3}]

Code.eval_file / 2 - оценивает содержимое файла ... Возвращает результат последнего выражения в файле.

binding, возвращаемый Code.eval_file/2, работает следующим образомэто:

data.txt:

a = 3
b = 4
"#{a} + #{b} = #{a+b}"

a.ex:

defmodule A do
  def get_term(fname) do
    {term, binding} = Code.eval_file(fname, ".")
    IO.inspect binding
    IO.puts binding[:a]
    term
  end
end

В iex:

iex(22)> c "a.ex"             
warning: redefining module A (current version defined in memory)
  a.ex:1

[A]

iex(23)> A.get_term "data.txt"
[a: 3, b: 4]
3
"3 + 4 = 7"
0 голосов
/ 14 июня 2019

Вот способ сделать это с двоичным сопоставлением с образцом:

def dequote(input) do
  length = String.length(input) - 2
  <<"\"", unquoted::binary-size(length), "\"">> = input
  unquoted
end

Вот способ сделать это с помощью регулярных выражений:

def dequote(input) do
  [dequote] = Regex.run(~r/\A"(.*)"\z/, input, capture: :all_but_first)
  dequote
end
...