一个关于 $. 在foreach while的简单问题

一个关于 $. 在foreach while的简单问题

程序如下

#!/usr/local/bin/perl -w
open FILE,"001.pl";
#while(<FILE>){
foreach(<FILE>){
                print "$.  $_";
                }
close FILE;


foreach 打印的时候 $. 一直是一个固定的总行数,

while中 $. 却是 从1 --->总行数

很奇怪为什么会是这样,

先鄙视自己一下, 我google  foreach $.的时候被google转义了,
那是
while是一行一行读进来的,读一次,$.加一下
但是foreach是一起读进来的,所以$.始终是一
while 是按照行读的.
foreach 是数组方式.

这应该是区别吧.


QUOTE:
原帖由 churchmice 于 2008-5-9 16:06 发表
那是
while是一行一行读进来的,读一次,$.加一下
但是foreach是一起读进来的,所以$.始终是一

谢谢,原来是我自己理解的错误。 那么
foreach $file (<FILE>){print "$file\n";print $.}  

这个不是每次也读一行吗?

sorry 我可能钻牛角尖了,不过我分析大日志的时候一直貌似都是这样用的,好像以前不知道在那里看过说while(<>)  @lines=<FILE>  都是一次读入所有。。

foreach $_ (<>) {print $_} 好像应该是一次一行阿。。。

我再看看
不过
foreach 右边提供的是一个list环境,所以是一次读入,在文件很大的时候要避免
while右边提供的是一个scalar环境,所以一次读一行(一行的定义和$/有关),可以处理任意大小的文件


QUOTE:
原帖由 luckyelement 于 2008-5-9 16:11 发表
while 是按照行读的.
foreach 是数组方式.

这应该是区别吧.

@lines=<FILE>;
while(@lines){}
foreach(@lines){}

你的上面的说法好像在perl 入门里面我暂时没有找到,  while 和foreach 应该只是把文件作为一个大的数组,每次读入按照顺序读入数组中的一个。


QUOTE:
原帖由 churchmice 于 2008-5-9 16:18 发表

我再看看
不过
foreach 右边提供的是一个list环境,所以是一次读入,在文件很大的时候要避免
while右边提供的是一个scalar环境,所以一次读一行(一行的定义和$/有关),可以处理任意大小的文件

foreach  VAR (LIST) BLOCK

while (EXPR) BLOCK

这个是书中的定义。 貌似你的话让我明白了,不过好像更加糊涂了, 可能是我还没有搞清楚 scalar环境 代表什么把,
实验了下
自己的理解没有错
你foreach (<$file_handle>)里面的$.最后的line number
说明是一起读入的
$.在读入每一行的时候自动加,所以你如果用foreach的话,因为是一次性读入,所以$.已经变成了末尾行的line number


QUOTE:
原帖由 大狗狗 于 2008-5-9 16:25 发表



foreach  VAR (LIST) BLOCK

while (EXPR) BLOCK

这个是书中的定义。 貌似你的话让我明白了,不过好像更加糊涂了, 可能是我还没有搞清楚 scalar环境 代表什么把,

见本版第一页有个精华贴
mlist上一位大叔对上下文的定义


QUOTE:
原帖由 churchmice 于 2008-5-9 16:28 发表

见本版第一页有个精华贴
mlist上一位大叔对上下文的定义

可耻的问一句,可以给一个地址吗?

第一页没有精华贴,精华贴的地一页我正在看。