一 读取标准输入
(1)<STDIN>
<STDIN>: '行输入操作符',实际是'针对文件句柄'的'行输入操作符'
① 标量上下文
特点: 返回'输入数据的下一行',以'\n换行符-->键盘Enter按钮'结束
'标量'上下文: 遇到'换行符号'结束
② 列表上下文
特点: 返回所有'剩下的行',直到'文件结尾'为止
键盘 --> 'ctrl+d' --> 'eof-->end of file ' -->'文件结尾'
'列表'上下文: 遇到'文件结尾符'结束
++++++++++++++++++'不加chomp'++++++++++++++++++
++++++++++++++++++'加chomp'++++++++++++++++++
说明: 读取'所有行的内容',换行符除外
推荐: chomp(@lines = <STDIN>)
③ while和foreach在<STDIN>的区别
说明: 行输入操作符'<STDIN>'和Perl的'默认变量($_)'之间没有什么关联-->只是'输入的内容'恰好存在'默认变量中($_)'
特点: 行输入操作符会'读取所有的数据行'-->'一次性'将全部数据'读进内存' --> '不推荐'
1) while
+++++++++++++++++'while'+++++++++++++++++
说明: 如果'读取到文件结尾'-->'eof',表示undef-->'假'-->'则退出while循环'
判断条件:'0、''、undef'为假,'其余为真'
while(<STDIN>){
print "I saw $_";
}
2) foreach
++++++++++++++++'foreach'++++++++++++++++
说明: 在这里,(<STDIN>) '列表上下文'-->'返回一个列表',列表中的'每个元素'代表'一行输入'内容
返回: 许多'输入行'组成的'列表'
foreach(<STDIN>){
print "I saw $_";
}
强调: foreach如果'不指定'控制变量,'默认控制变量'是'$_' -->'$_'可以'省略'
foreach $_ (<STDIN>){
print "I saw $_";
}
3)差异性
+++++++++++++++'读取文件的差异性'+++++++++++++++
1)在'while'操作中,perl'读入一行',将它'赋予变量',然后'再进入循环',再'回到开头','读入下一行' -->'一次读取一行'
2)但在'foreach'中,它在'循环之前'读取所有的输入 -->'一次读取所有内容'
(2)裸钻石操作符
① ARGV
+++++++++++++'@ARGV'+++++++++++++
当perl脚本运行时,从'命令行上'传递给'它的参数'存储在'内建数组@ARGV中',@ARGV是perl'默认'用来'接收参数的数组',可以有多个参数
$ARGV[0]是表示接收到的'第一个参数',$ARGV[1]表示'第二个' -->默认'index从0开始'
$arguments = $ARGV --> '标量上下文' --> '命令行参数的个数'
② <>
裸钻石操作符'<>'是行输入操作符'<STDIN>'的'特列'
+++++++++++++'使用原则'+++++++++++++
1)<>操作'查看@ARGV'来决定'使用哪些文件'
2)如果'表为空',则使用'标准输入流'
3)否则使用其'找到的相应文件'
4)也就是'在启动程序后'、'使用<>之前',你还有机会'修改@ARGV'的值
③ 最佳实践
每次'读取一行' -->'<>'在这里是'标量上下文'
while (<>){
# 等价chomp($_); -->不加参数时,'直接作用在$_'
chomp;
# 说明: 每一行的内容 -->根据'自己的需求'处理
print "$_"
}
1)命令行参数
++++++++++'print("@ARGV")前后对比'++++++++++
注意: 一旦通过'命令行参数形式'传递则被'消耗后'-->会从'@ARGV数组'中'弹出'
#!/usr/bin/perl
use v5.16;
use strict;
use warnings FATAL => 'all';
use utf8;
print("@ARGV");
# 1)命令行参数作为文件,"裸钻石操作符"读取
while (<>) {
print "$_";
}
print("\n");
print("@ARGV");
__END__
2)代码内修改ARGV
二 输出到标准输出
(1)print
说明: print是'列表操作符'
① print带不带括号
1)没有歧义
1)print操作符会读取'后续列表中'的'所有元素',并把'每一项(字符串)'依次送到'标准输出'
备注: 每一项'之前'、'之后'与'之间'都'不会再加上'额外的字符
重点: 列表元素之间'没有空白'
++++++++++++++'等价形式'++++++++++++++
print'带括号'和'不带括号' -->只要'没歧义',效果一样
原则: 除非这样做'会改变'表达式的意义,否则Perl里的括号'可以省略'
print 1, 2, 3;
print(1, 2, 3);
2)有歧义
++++++++++'二者差异'++++++++++
print(3+4)*4;
② 数组内插
③ perl模拟linux命令
print <> -->'列表上下文' --> Linux下的'cat'命令
print sort <>; -->'列表上下文' --> Linux下的'sort'命令
后续: 用Perl'重写'所有的Unix工具程序
④ Perl的输出:print、say和printf、sprintf
print不自带换行符,say'自带换行符',但要使用say,必须'写use语句use 5.010;'-->'perl高级版本才支持'
printf有需求即可 -->'格式字符串' -->'%d'、'%g'、'%s'、'%f-->四舍五入'
1)'%.2f' -->'保留两位小数'
2)'%-2s' -->'左对齐'
3)'%%' -->输出真正的'百分号'