使用索引数组作为值来评估字符串

丹尼·B

我想要一个包含位置参数标记(未命名)的字符串,为它提供值的数组(而不是哈希),并对其求值。

用例作为示例将有点像ARGV。

例如,

# given:
string = "echo $1 ; echo $@"
values = ["hello", "world"]

# expected result:
"echo hello ; echo hello world"

以下功能是我能想到的最好的功能:

def evaluate_args(string, arguments)
  return string unless arguments.is_a? Array and !arguments.empty?

  # Create a variable that can replace $@ with all arguments, and quote
  # arguments that had "more than one word" originally
  all_arguments = arguments.map{|a| a =~ /\s/ ? "\"#{a}\"" : a}.join ' '

  # Replace all $1 - $9 with their respective argument ($1 ==> arguments[0])
  string.gsub!(/\$(\d)/) { arguments[$1.to_i - 1] }

  # Replace $@ or $* with all arguments
  string.gsub!(/\$[*|@]/, all_arguments)

  return string
end

在我看来,它可以而且应该更简单。

我希望找到更接近Kernel.sprintf做事方法的东西-例如"string with %{marker}" % {marker: 'value'}

因此,尽管这个问题几乎已经为我解决了(我认为),但我还是想知道我是否错过了可以使它更加优雅的东西。

乔丹跑步

似乎您正在尝试重现Bash风格的变量扩展,这是一个非常复杂的问题。不过,至少可以用两种方法简化代码:

  1. 使用Kernel.sprintf的内置位置参数功能。下面的代码通过$1sprintf等价的代替%1$s
  2. 使用标准库中的Shellwords以空格等转义参数。
require 'shellwords'

def evaluate_args(string, arguments)
  return string unless arguments.is_a? Array and !arguments.empty?
  tmpl = string.gsub(/\$(\d+)/, '%\1$s')
  (tmpl % arguments).gsub(/\$[*@]/, arguments.shelljoin)
end

string = "echo $1 ; echo $@"
values = ["hello", "world"]

puts evaluate_args(string, values)
# => echo hello ; echo hello world

如果您没有$*要求,建议您删除类Bash格式并使用sprintf,因为它涵盖了您提到的所有其他内容。即使这样,您也可以通过sprintf对其他所有内容使用格式来进一步简化事情

def evaluate_args(string, arguments)
  return string unless arguments.is_a? Array and !arguments.empty?
  string.gsub('%@', arguments.shelljoin) % arguments
end

string = "echo %1$s ; echo %@"
values = ["hello", "world"]

puts evaluate_args(string, values)
# => echo hello ; echo hello world

编辑

如果要%{1}与之一起使用,则sprintf可以将输入数组转换为哈希,其中将整数索引转换为符号键,例如["hello", "world"]变为{ :"1" => "hello", :"2" => "world" }

require "shellwords"

def evaluate_args(string, arguments)
  return string unless arguments.is_a? Array and !arguments.empty?
  string % {
    :* => arguments.shelljoin,
    **arguments.map.with_index {|val,idx| [ :"#{idx + 1}", val ] }.to_h
  }
end

string = "echo %{1} ; echo %{*}"
values = ["hello", "world"]

puts evaluate_args(string, values)
# => echo hello ; echo hello world

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

评估字符串作为数组

来自分类Dev

在 NumPy 中使用字符串作为数组索引

来自分类Dev

使用libsvm评估字符串数组

来自分类Dev

使用数组元素作为字符串值

来自分类Dev

如何使用字符串作为键和数组作为值来声明和初始化关联数组

来自分类Dev

Python:如何使用字符串索引 ( '[0][1][0]' ) 作为多维数组的索引

来自分类Dev

Mongodb根据字段是否包含数组值作为子字符串来查询集合

来自分类Dev

使用字符串来评估枚举?

来自分类Dev

如何使用整洁的评估与列名作为字符串?

来自分类Dev

在Java 8 Lambda-Stream中使用字符串数组作为值并以Enum作为键来创建Hashmap

来自分类Dev

在Java 8 Lambda-Stream中使用字符串数组作为值并以Enum作为键来创建Hashmap

来自分类Dev

TypeScript React:使用字符串数组作为索引并从状态获取值

来自分类Dev

使用字符串作为数组索引标识符(无循环)

来自分类Dev

使用字符串作为名称来设置属性值

来自分类Dev

使用字符串值作为className来调用方法

来自分类Dev

如何使用组合或字符串作为DataFrame(熊猫)的索引?

来自分类Dev

javascript数组| 如果值包含字符串,则返回索引

来自分类Dev

获取Enum值作为字符串数组

来自分类Dev

快速创建字典,将字符串数组作为值

来自分类Dev

在JavaScript中获取数组/对象的值作为字符串

来自分类Dev

如何在经典ASP中使用索引获取数组字符串值

来自分类Dev

如何将字符串值更改为要在数组中使用的索引值?

来自分类Dev

在JavaScript中使用给定字符串的值获取多维数组的索引

来自分类Dev

如何使用值作为由“-”分割的字符串对 PHP 数组进行排序

来自分类Dev

用数组php评估字符串

来自分类Dev

通过使用“ foreach”语句将字符串数组的索引值设置为Enumerable数组中的项的值。

来自分类Dev

PHP-通过使用字符串作为键来获取多维数组中元素的引用

来自分类Dev

使用给定的用户搜索字符串数组,并返回匹配的字符串数组的索引

来自分类Dev

尝试使用 php 中的字符串匹配来获取数组值时,会创建两个数组

Related 相关文章

  1. 1

    评估字符串作为数组

  2. 2

    在 NumPy 中使用字符串作为数组索引

  3. 3

    使用libsvm评估字符串数组

  4. 4

    使用数组元素作为字符串值

  5. 5

    如何使用字符串作为键和数组作为值来声明和初始化关联数组

  6. 6

    Python:如何使用字符串索引 ( '[0][1][0]' ) 作为多维数组的索引

  7. 7

    Mongodb根据字段是否包含数组值作为子字符串来查询集合

  8. 8

    使用字符串来评估枚举?

  9. 9

    如何使用整洁的评估与列名作为字符串?

  10. 10

    在Java 8 Lambda-Stream中使用字符串数组作为值并以Enum作为键来创建Hashmap

  11. 11

    在Java 8 Lambda-Stream中使用字符串数组作为值并以Enum作为键来创建Hashmap

  12. 12

    TypeScript React:使用字符串数组作为索引并从状态获取值

  13. 13

    使用字符串作为数组索引标识符(无循环)

  14. 14

    使用字符串作为名称来设置属性值

  15. 15

    使用字符串值作为className来调用方法

  16. 16

    如何使用组合或字符串作为DataFrame(熊猫)的索引?

  17. 17

    javascript数组| 如果值包含字符串,则返回索引

  18. 18

    获取Enum值作为字符串数组

  19. 19

    快速创建字典,将字符串数组作为值

  20. 20

    在JavaScript中获取数组/对象的值作为字符串

  21. 21

    如何在经典ASP中使用索引获取数组字符串值

  22. 22

    如何将字符串值更改为要在数组中使用的索引值?

  23. 23

    在JavaScript中使用给定字符串的值获取多维数组的索引

  24. 24

    如何使用值作为由“-”分割的字符串对 PHP 数组进行排序

  25. 25

    用数组php评估字符串

  26. 26

    通过使用“ foreach”语句将字符串数组的索引值设置为Enumerable数组中的项的值。

  27. 27

    PHP-通过使用字符串作为键来获取多维数组中元素的引用

  28. 28

    使用给定的用户搜索字符串数组,并返回匹配的字符串数组的索引

  29. 29

    尝试使用 php 中的字符串匹配来获取数组值时,会创建两个数组

热门标签

归档