【问题标题】:Why does an array of text lines appear to have an extra level of container?为什么文本行数组似乎有一个额外的容器级别?
【发布时间】:2021-12-24 23:09:31
【问题描述】:

我正在使用 Dyalog 的 ⎕nget 的“行数组”模式读取文件:

lines _ _ ← ⎕nget '/usr/share/dict/words' 1

而且它似乎有效:

          lines[1]
 10th

但个别元素似乎不是字符数组:

          line ← lines[1]
          line
 10th
          ≢ line
1
          ⍴ line
     

在这里,我们看到第一行的计数为 1,形状为空数组。我无法进一步索引它; lines[1][1]line[1] 是排名错误。如果我在 RHS 上使用 ⊂,我可以一次将值分配给多个变量,并为每个变量获得相同的行为。但是,如果我在没有左鞋的情况下 进行多项分配,我会得到:

          word rest ← line
          word
10th
          ≢ word
4
          ⍴ word
4

我们终于得到了我期望的字符数组!然而,它并没有明显与隐藏在line 中的其他任何东西分开;另一个变量是相同的:

          rest
10th
          ≢ rest
4
          ⍴ rest
4
          word ≡ rest
1

值得注意的是,当我查看 word 时,它没有前导空格,这与 line 不同。因此,⎕nget 返回的内容矩阵中的各个数组元素似乎被进一步包裹在不显示形状或计数的东西中,并且无法被索引到,但是当我使用解构赋值时,它会展开他们。感觉很像 Common Lisp 中的多值内容。

如果有人能解释这里发生了什么,我将不胜感激。我觉得我错过了一些非常基本的东西。

【问题讨论】:

    标签: arrays string apl dyalog


    【解决方案1】:

    以“行数组”模式读取文件的结果是一个嵌套数组。它具体是一个字符向量的嵌套向量,其中每个字符向量都是文本文件中的一行。

    例如,这里取\tmp\test.txt

    my text file
    has 3
    lines
    

    如果我们读到这个,我们可以检查内容

          (content newline encoding) ← ⎕nget'\tmp\test.txt' 1
          ≢ content     ⍝ How many lines?
    3
          ≢¨content     ⍝ How long is each line?
    12 5 5
          content[2]    ⍝ Indexing returns a scalar (non-simple)
    ┌─────┐
    │has 3│
    └─────┘
          2⊃content     ⍝ Use pick to get the contents of the 2nd scalar
    has 3
          ⊃content[2]   ⍝ Disclose the non-simple scalar
    has 3
    

    您可能read from the online documentation⎕NGET 的默认行为是引入一个简单的(非嵌套)字符向量,其中嵌入了换行符。这些通常取决于操作系统。

          (content encoding newline) ← ⎕nget'\tmp\test.txt' 
          newline   ⍝ Unicode code points for line endings in this file  (Microsoft Windows)
    13 10
          content
    my text file
    has 3       
    lines       
                
          content ∊ ⎕ucs 10 13
    0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1
    

    但是在“行数组”模式下,你会得到一个嵌套的结果。

    有关嵌套数组和数组模型的快速介绍,请参阅Stefan Kruger's LearnAPL book

    【讨论】:

    • 我理解了嵌套的部分,但是缺少了——或者更确切地说,在不知道我在描述什么的情况下描述了——每个数组都是“封闭的”并且需要“公开”才能得到实际的我寻求的价值。显然我还有一些阅读要做,所以谢谢你的书链接。
    【解决方案2】:

    如果您打开拳击,就更容易看到正在发生的事情。每个元素都是一个封闭的字符向量。使用 pick 而不是括号索引 [] 来获取实际项目。

      words ← ⊃⎕nget'/usr/share/dict/words'1
      ]box on -s=max
      ⍴words
    ┌→─────┐
    │235886│
    └~─────┘
      
      words[10]
    ┌─────────┐
    │ ┌→────┐ │
    │ │Aaron│ │
    │ └─────┘ │
    └∊────────┘
      
      10⊃words ⍝ use pick
    ┌→────┐
    │Aaron│
    └─────┘
    

    【讨论】:

    • 我当然应该打拳击。但是我仍然会感到困惑,这个词是双框的,但我无法用[1][1] 理解它。外壳与“数组”不同的想法和从括号索引中选择具有不同语义的想法对我来说都是新的......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多