更改文件路径
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 'c
或 test/1/2: 'c
都有效。
但不是当 test
是 file!
:
>> 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
我想把[%a/b]
改成[%a/c]
。
基本上,与 Change path or refinement 相同,但用 file!
代替:
I want to change the
a/b
inside a block toa/c
test: [a/b]
在这种情况下,change next test/1 'c
或 test/1/2: 'c
都有效。
但不是当 test
是 file!
:
>> 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