从标准输入读取字符串

Julia 中的 STDIN 流是指标准输入 。这可以表示用户输入,交互式命令行程序,或来自已重定向到程序的文件或管道的输入。

当没有提供任何参数时,readline 函数将从 STDIN 读取数据,直到遇到换行符,或者 STDIN 流进入文件结束状态。这两种情况可以通过\n 字符是否被读作最终字符来区分:

julia> readline()
some stuff
"some stuff\n"

julia> readline()  # Ctrl-D pressed to send EOF signal here
""

通常,对于交互式程序,我们不关心 EOF 状态,只想要一个字符串。例如,我们可能会提示用户输入:

function askname()
    print("Enter your name: ")
    readline()
end

然而,由于额外的换行符,这不太令人满意:

julia> askname()
Enter your name: Julia
"Julia\n"

chomp 函数可用于从字符串中删除最多一个尾随换行符。例如:

julia> chomp("Hello, World!")
"Hello, World!"

julia> chomp("Hello, World!\n")
"Hello, World!"

因此,我们可以使用 chomp 来增强我们的功能,以便结果符合预期:

function askname()
    print("Enter your name: ")
    chomp(readline())
end

这有一个更理想的结果:

julia> askname()
Enter your name: Julia
"Julia"

有时,我们可能希望尽可能多地读取行(直到输入流进入文件结束状态)。readlines 功能提供了这种功能。

julia> readlines()  # note Ctrl-D is pressed after the last line
A, B, C, D, E, F, G
H, I, J, K, LMNO, P
Q, R, S
T, U, V
W, X  
Y, Z
6-element Array{String,1}:
 "A, B, C, D, E, F, G\n"
 "H, I, J, K, LMNO, P\n"
 "Q, R, S\n"
 "T, U, V\n"
 "W, X\n"
 "Y, Z\n"

Version >= 0.5.0

再一次,如果我们不喜欢 readlines 读取的行末尾的换行符,我们可以使用 chomp 函数删除它们。这次,我们在整个阵列中广播 chomp 函数:

julia> chomp.(readlines())
A, B, C, D, E, F, G
H, I, J, K, LMNO, P
Q, R, S
T, U, V
W, X  
Y, Z
6-element Array{String,1}:
 "A, B, C, D, E, F, G"
 "H, I, J, K, LMNO, P"
 "Q, R, S"            
 "T, U, V"            
 "W, X  "             
 "Y, Z"               

其他时候,我们可能根本不关心线条,只想尽可能多地读取单个字符串。readstring 功能实现了这个目的:

julia> readstring(STDIN)
If music be the food of love, play on,
Give me excess of it; that surfeiting,
The appetite may sicken, and so die.  # [END OF INPUT]
"If music be the food of love, play on,\nGive me excess of it; that surfeiting,\nThe appetite may sicken, and so die.\n"

# [END OF INPUT] 不是原始输入的一部分;为了清楚起见,它已被添加。)

请注意,readstring 必须通过 STDIN 参数。