标准输入输出
标准输入:
<STDIN>
标准输出:
<STDOUT>
标准输入
标准输入为$line = <STDIN>
当程序运行时,可以直接从键盘键入输入
- 如果输入的是标量,按回车代表结束输入
- 如果输入的是列表,Linux下,
ctrl+D
的组合键结束输入
1 use warnings;
2
3 print "Please input: ";
4 $line = <STDIN>;
5
6 print "the \$line is: $line\n";
执行结果为:
在代码中,输出时只有一个\n
,可在打印是,却显示有两个换行符
这可以理解为,我们在输入的时候,因为按了回车,所以会多出一个换行符
若想去掉从键盘输入时的换行符
,可以用chomp
chomp
chomp
可以去掉输入时的换行符
1 use warnings;
2
3 print "Please input: ";
4 $line = <STDIN>;
5 chomp($line);
6 print "the \$line is: $line\n";
运行结果为:
可以看到,输出时已经少了一个换行符,也可以改写为:chomp($line = <STDIN>);
,看着更简洁
1 use warnings;
2
3 print "Please input: ";
4
5 chomp($line = <STDIN>);
6
7 print "the \$line is: $line\n";
~
在循环块中的简写
在循环语句中,整行输入符可以进行简写,比如:foreach(<STDIN>)
或者while(<STDIN>)
其中foreach
用于列表,while
用于字符(for循环
和while
是一样的),只有这两种循环语句可以用这种简写
钻石操作符
钻石操作符<>
是另一种读取输入的方法
钻石操作符是行输入的特例,但它不是从键盘获取输入,而是从用户指定的位置获取数据
1 while(defined($line = <>)){
2 chomp($line);
3 print "It was $line that I saw!\n";
4 }
在这个例子中,如果调用的参数是fred、barney和betty,输出结果就会是It was [从文件fred取得的一行内容]that I saw!
,It was[从文件fred取得的另一行内容]that I saw!
等,直到遇到文件fred的结尾为止。接下来会自动切换的文件barney,并且中间没有间断
钻石操作符就好像把这个文件放在了一个大文件中
钻石操作符通常会处理所有的输入,因此钻石操作符不能同时出现在一个程序的多个位置
调用参数
钻石操作符的参数来自@ARGV数组,这个数组的内容是由命令行参数组成的列表
@ARGV在程序开始时就已经被塞满了调用参数
如果@ARGV是个空列表,就会改用标准输入流
输出到标准输出
print
操作符会读取后续的所有元素,并把每一项一次送到标准输出
区分两个print
1 @array = (1..5);
2
3 print @array,"\n";
4 print "@array\n";
第一个print
语句会一个接一个地打印数组中的所有元素,元素之间没有空格
第二个print
语句中,每个元素之间由空格隔开
在这里,要额外说明一点,在第一个print
语句中,我使用了换行符,起初我的写法是
1 @array = (1..5);
2
3 print @array."\n";
4 print "@array\n";
发现运行的结果为
第一个print
语句打印的并不是没有空格的元素,这是因为.
用在标量
在第一个print
语句中,因为使用了.
,perl便把@array
当成是一个标量,最终返回的是这个数组的长度5
当print
和标准输入流一起用时的情况
1 use warnings;
2
3 print "Please input:\n";
4 my @array = <STDIN>;
5
6 print "*****************\n";
7
8 print "The first print is:\n";
9 print @array,"\n";
10
11 print "-----------\n";
12 print "The second print is:\n";
13 print "@array\n";
可以看到,在第二个print
打印的结果中,除了第一行,后面的每一行都有缩进了一个空格,这是使用双引号输出造成的
print与括号
加入print
的调用看起来像函数调用,那它就是一个函数调用
在函数调用里,函数名后面必须紧接着一对括号
1 print (2 + 3);
函数调用,返回的是2 + 3
的值
- 没有括号的时候,
print
是列表操作符,会把其后的列表里的所有东西全部输出 - 有括号的时候,就是一个函数调用,只将括号内的东西输出来
1 print "All in bracket: ";
2 print (2 + 3);
3
4 print "\n";
5
6 print "Part in bracket: ";
7 print (2 + 3) * 4;
8
9 print "\n";
可以看到,两个函数调用输出的结果是一样的,只把括号里的内容输出来了