更改文件路径

Change file paths

我想把[%a/b]改成[%a/c]。 基本上,与 Change path or refinement 相同,但用 file! 代替:

I want to change the a/b inside a block to a/c

test: [a/b]

在这种情况下,change next test/1 'ctest/1/2: 'c 都有效。 但不是当 testfile!:

>> test: [%a/b]
== [%a/b]
>> test/1
== %a/b
>> test/1/2         ; can't access 2nd value
== %a/b/2
>> next first test  ; not quite what you expect
== %/b

尝试 change 它不会提供您期望的东西:

>> change next test/1 'c
== %b
>> test
== [%acb]

文件是字符串类型,可以像修改字符串一样进行操作。例如:

test: [%a/b]
replace test/1 %/b %/c

这是因为文件!是任意字符串!不是任意数组!

>> any-string? %a/c
== true
>> any-array? 'a/c
== true

所以文件中的目录分隔符'/'!对动作 CHANGE 没有任何特殊意义。所以 %a/b 中的 'a'、'/' 和 'b' 的处理方式相同,解释器不会尝试将其解析为两段文件路径 [a b]。

虽然对于路径!,因为它是一个数组,每个组件都是一个 rebol 值,解释器知道这一点。例如,a/bcd 中的 'bcd' 将被视为一个整体(一个词!),而不是三个字符 'b'、'c' 和 'd'。

我同意该文件!作为一个任意字符串!不方便。

你混淆了path!file!系列,它们看起来很相似,但它们的性质却大不相同。

一个path!是一组值(通常是word!个值),用斜杠符号分隔,一个file!是一个char!个值的集合。 file! 系列中的斜杠字符只是字符,因此 file! 不知道任何子结构。它(大部分)具有 string! 系列的语义,而 path! 具有 block! 系列的语义。

现在已经清除了,关于 test/1/2 结果,路径符号在 file! 系列上的行为与在 string![=44= 上的行为不同], 它会做一个聪明的 concatenation 而不是充当访问器。之所以称为 smart,是因为它可以很好地处理左右两部分中出现的额外斜杠字符。例如:

>> file: %/index.html
== %/index.html

>> path: %www/
== %www/

>> path/file
== %www/file

>> path/:file
== %www/index.html

相同的路径符号规则也适用于 url! 系列:

>> url: http://red-lang.org
== http://red-lang.org

>> url/index.html
== http://red-lang.org/index.html

>> file: %/index.html
== %/index.html

>> url/:file
== http://red-lang.org/index.html

因此,要更改 test: [%a/b] 的嵌套内容,因为 file! 的行为基本上与 string! 相同,您可以使用任何可用的字符串方法来修改它。例如:

>> test: [%a/b]
== [%a/b]

>> change skip test/1 2 %c
== %""

>> test
== [%a/c]

>> change next find test/1 slash "d"
== %""

>> test
== [%a/d]

>> parse test/1 [thru slash change skip "e"]
== true

>> test
== [%a/e]

这是一个可能很麻烦的解决方案,但适用于将它们视为文件的目录

test/1:  to-file head change skip split-path test/1 1 %c