2

我正在尝试根据必需和可选但理想字段的简短列表在 ruby​​ 中编写一个基本的 MARC 验证器,部分是作为在 ruby​​ 中编写一些东西的练习,我不太熟悉。

我想出了看起来像有效的 ruby​​ 代码来存储我的“可选”字段(并且脚本在启用代码时执行):

Optional = ['006', '007', '010', '020', '022', {'040' => ['c']}, '041', ['050',  '060',  '082',  '086',  /09\d/], {/1\d\d/ => ['a']}, {'240' => ['a']}, '250', {'260' => ['a',  'b',  'c']}, {'300' => ['a']}, '490', /7[0-5]\d/, '830']

根据我有限的阅读,这在技术上是可行的......但我不确定从这里去哪里。我想遍历记录中的各个字段,如果缺少字段(或子字段,如果注明),请在屏幕上写入警告:

sysnum = record['001']
record.fields.each do |field|
  Optional.each do |optfield|
    if field.tag =~ optfield
      break
    else
      puts "#{sysnum} is missing #{field.tag}"
    end
  end
end

但是,这不适用于我的所有情况,因为并非所有optfield值都是字符串。我应该使用 if 块来测试哈希吗?正则表达式值呢?=~当右侧不是正则表达式(string =~ otherstring而不是)时是否会测试为真string =~ regex

我在这里完全吠错了树吗?

4

1 回答 1

1

您可能想要使用===,您可以将其解读为“有点等于”。如您所料,它适用于字符串和正则表达式:

'100' === '100'
# true
/1\d\d/ === '100'
# true

对于您的数组,您可以使用Regexp.unionwhich 将字符串数组转换为匹配任何这些字符串的正则表达式。

于 2015-05-06T21:11:20.390 回答