为什么文本行数组看起来有一个额外的容器级别?

Why does an array of text lines appear to have an extra level of container?

我正在使用 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 时,它没有前导 space,这与 line 不同。因此, ⎕nget 返回的内容矩阵中的各个数组元素似乎被进一步包裹在形状或计数中未显示的东西中,并且无法索引,但是当我使用解构赋值时它打开它们。感觉很像 Common Lisp 中的多值东西。

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

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

例如这里取\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

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

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