【问题标题】:Split the array by anything that isn't a letter用任何不是字母的东西分割数组
【发布时间】:2017-05-14 18:07:53
【问题描述】:

我有一个类将检查用户环境以了解他们是否安装了python,该类的目的是检查用户是否安装了多个版本的python,并且不默认为三个:

class CheckForPythonicVariables

  class << self

    def find_python_env_var
      py_path = []  # Results of the python env variables
      env_vars = ENV.to_h
      items = env_vars["Path"].split(";")  # Split the environment variables into an array
      items.each { |var|
        if var.to_s.include?("Python")  # Do you have python?
          py_path.push(var)
        end
      }
      py_path.each { |python|
        if python.include?("Python27")  # Python 2.7.x?
          return true
        elsif python.include?("Python3")  # Python 3.x.x?
          return false
        else
          raise "You do not have python installed"
        end
      }
    end

  end

end

现在可以了,但它只适用于 Windows 和少数 Linux OS,显然 Parrot 不是其中之一。有没有办法可以通过任何不是字母的方式来#split() 环境变量?例如:

Windows 环境变量:C:\Python27\;C:\Python27\Scripts;C:\ProgramData\Oracle\Java\javapath Parrot OS 环境变量:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

注意变量是如何用分号(;)或冒号(:)分割的,有没有办法可以在ruby中使用#split()函数,并用任何不分割的东西分割字母数字字符还是数字?或者有没有更好的方法来确保用户在他们的环境变量中有python 2.7.x

【问题讨论】:

  • 也许你可以简单地使用 split 两次?或者,根据操作系统:MS-DOS 或 Unix,您选择了正确的分隔符?作为替代方案,也许您可​​以使用 Ruby 的命令行/shell 来查询 python 版本? 'python -V'
  • @Hugo 系统调用的问题(system('python --version')我确实想到了)是如果他们有多个版本的python,它将默认为3。

标签: ruby environment-variables ruby-2.3 parrot-os


【解决方案1】:

你可以像下面这样检查用户当前的python版本:(source)

%x(python -c 'print __import__("sys").version_info < (2,8)') == "True\n"

但是如果用户安装了 python 3 和 python 2.7,并且他们现在使用 python 3。脚本无法处理这种情况。

【讨论】:

  • 这就是找到变量的关键,如果它们有 3 则它不会运行,但如果它们有 2 和 3,它将创建一个名为 python27 的临时变量并从那里运行它.
  • 这也不起作用:文件 "", line 1 'print ^ SyntaxError: EOL while scanning string literal false
【解决方案2】:

此正则表达式匹配所有非字母数字字符:/[^a-zA-Z0-9]/

如果要匹配所有非字母数字字符不包括正斜杠和反斜杠,请使用/[^a-zA-Z0-9\/\\]/

例子:

str = 'C:\Python27\;C:\Python27\Scripts;C:\ProgramData\Oracle\Java\javapath'
str.split /[^a-zA-Z0-9\/\\]/
# => ["C", "\\Python27\\", "C", "\\Python27\\Scripts", "C", "\\ProgramData\\Oracle\\Java\\javapath"]

str = '/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games'
str.split /[^a-zA-Z0-9\/\\]/
# => ["/usr/local/bin", "/usr/bin", "/bin", "/usr/local/games", "/usr/games"]

【讨论】:

  • 它需要在所有操作系统上工作,但这基本上是我想要的。
  • 添加了 Parrot OS 示例
  • 你这个人!谢谢,我还不打算接受,因为我想看看其他人的想法。但这对我来说似乎是一个好的开始
  • 在我的系统上,Python 安装在/Users/Jörg W Mittag/_Python。不确定这会对您的脚本产生什么影响。
  • @JörgWMittag 你有什么样的操作系统?
猜你喜欢
  • 1970-01-01
  • 2022-01-19
  • 2011-09-13
  • 1970-01-01
  • 1970-01-01
  • 2013-11-21
  • 2011-05-17
  • 1970-01-01
  • 2018-10-26
相关资源
最近更新 更多