第 11 章:文本与输入输出

生成一段文字和把它打印出来是两个步骤。前者产生字符串,后者让终端发生可见的变化。把两者分开后,可以单独检查文本内容,也可以选择打印到哪里、打印几次。

完整程序:生成问候语并分两行输出

寻观「标准库」之书。

「问候」乃化「字符串」而「字符串」也。
「问候」者会「姓名」而
    「字符串拼接」于『你好,』于「姓名」也。

(「打印行」于(「问候」于『小林』);
 「打印行」于『开始学习函数。』)。

输出为:

你好,小林
开始学习函数。

「问候」 只返回字符串,单独计算它不会打印。「打印行」 接收字符串,在标准输出中写出文字并换行。

分号控制执行顺序

甲;乙 先执行甲,再执行乙,整个表达式返回乙的结果。上面的括号把两次打印组成一个表达式,分号明确指定它们的先后顺序。

中文句号 分隔顶层声明,中文分号 在表达式内部安排顺序,两者用途不同。写文件、打印、修改引用等操作会影响程序状态或外部环境,这类影响通常称为副作用。

「打印行」 的返回类型是 「有」。它是单元类型,常用值为 「元」,用于表示“没有额外结果需要返回”。不要把打印函数的结果当作已经打印的字符串。

读取一行输入

读取可能成功,也可能因为输入结束而读不到一行。「尝试读取标准输入行」 返回 「爻」合「字符串」:第一个值表示是否成功,第二个值保存文本。

下面是另一个完整程序,可以直接替换入口文件:

寻观「标准库」之书。

鉴(「尝试读取标准输入行」于「元」)而
    有(「成功」与「内容」)则
        若「成功」
        则「打印行」于(「字符串拼接」于『收到:』于「内容」)
        否则「打印行」于『输入已结束。』。

构建后,可以用终端管道测试,无需交互输入:

printf '你好\n' | ./yy教程练习
./yy教程练习 < /dev/null

第一次应输出 收到:你好,第二次应输出 输入已结束。。成功读到空行和输入已经结束是两种情况,所以不能只看字符串是否为空。

练习

交换第一个程序中分号两边的打印语句,预测并检查输出顺序。再用 printf '\n' | ./yy教程练习 测试读取程序:应输出 收到:,而不是输入结束提示。

上一章 · 下一章:缺失结果、异常与可变状态 · 目录