Perl(十六)输出和输出(一)

文件描述符

一   读取标准输入

(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)'%%'   -->输出真正的'百分号'

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值