比较两段CODE,请您帮修改!谢谢~



QUOTE:
原帖由 perljoker 于 2008-1-18 09:50 发表

Lonki代码确实漂亮……,不过
my %id_all = map { /(\d+)\s+(.*)\s*/ } ;
这句话我确实没看懂,map左边是hash,map里面是个正则
这样做会得到什么结果呢?还是竟然能得到$1和$2?

to LZ,我那个 ...

----------------------------------------------------
同样期待Lonki的解答!

确实如此
map会自动返回后面正则表达式得到的$1和$2作为对值返回
他第二个表达式要容易看懂


QUOTE:
原帖由 perljoker 于 2008-1-18 10:32 发表

确实如此
map会自动返回后面正则表达式得到的$1和$2作为对值返回
他第二个表达式要容易看懂

-------------------------------------------
第一个map语句看不懂,我找不到依据!《大骆驼》中关于map一节也没有提及这种写法,依据何在?
依据大概是这样的
my %id_all = map { /(\d+)\s+(.*)\s*/ } <ID_ALL>;
分解开来,我认为是这样的:

[Copy to clipboard] [ - ]
CODE:
my %id_all;
while(<ID_ALL>){
  my($aa,$bb) = $_ =~/(\d+)\s+(.*)\s*/;   #flag
  $id{$aa}=$bb;
}

应该就是如此了……,我把map给解开了
map {BLOCK} @array;
那个Block返回应该就是flag那行

如果弄错了,大家拿苹果咂我吧……
回perljoker:我找到这种写法的依据了,详细请看仙子的”简简单单map":

QUOTE:
(仙子注:上文是说遍历每个LIST元素时产生一个结果列表,而不是说总的map结果是个列表,不要搞混了哦。)
2. 转换数组到hash:找到某个数组值的索引

代替重复的搜索数组,我们可以用map来转换数组到hash,并通过hash关键字来进行直接查找。如下的map用法相对于重复的数组搜索,更简单高效。

@teams = qw(Miami Oregon Florida Tennessee Texas
            Oklahoma Nebraska LSU Colorado Maryland);
%rank = map { $teams[$_], $_ + 1 } 0 .. $#teams;
print "Colorado: $rank{Colorado}\n";
print "Texas: $rank{Texas} (hook 'em, Horns!)\n";

打印结果是:
Colorado: 9
Texas: 5 (hook 'em, Horns!)

上述code容易理解哦,0 ..$#teams 是个列表,$#teams代表@teams最后一个元素的下标值(这里是9),所以这个列表就是0-9这几个数了。map遍历上述列表,将每个列表元素临时设置为$_,并对$_在中间的{}里进行计算;{ $teams[$_], $_ + 1 },这里每次计算后返回一个2元素的列表,列表结果是某个数组值和对应的数组下标加1,明白了呀?

由于对每个LIST元素进行计算时,都产生一个2元素的列表,所以总的map结果就可看作一个hash了。hash关键字就是数组元素,hash值是对应的数组下标加1。

呵呵,学了一个终极招~正是我所需要的东东!

考虑到hash典型的2种初始化:
my %hash = ('a' => 1, 'b' => 2)

my %hash = ('a', 1, 'b', 2)
效果一致

于是有了:
my %hash = map { $_, $_ } (0..9)

my %hash = map { $_ => $_ } (0..9)
效果一致

在map { /.../ }中有2组(), 即每次返回$1和$2.
就是这样了.




$ perl -ne 'print "$ARGV[0] $ARGV[1] $ARGV[2] $. $_"' file1 file2
file2   1 123
   2 456
$
file1的内容是123,file2的内容是456。好象不行呢。
而且如果要用ARGV来判断,我必须先知道文件名才行, ...



QUOTE:
原帖由 ly5066113 于 2008-1-18 09:54 发表
路过问一下,如果我用
perl -e '........' file1 file2 ....filen
的方式处理n个文件,我有什么办法能判断我现在处理的是哪个文件?

----------------------------------------------------------------------

QUOTE:
file1内容为123
file2内容为456
perl -e "while(<>){print $ARGV if bof;print;}" file1 file2
Result:
123
123
456
456

这结果如何看出现在正处理哪个文件?
我也想知道如何解决,大家赐教!谢谢!

没啥问题

[Copy to clipboard] [ - ]
CODE:
C:\>echo 123>f1

C:\>echo 456>f2

C:\>perl -e "while(<>){print $ARGV if bof;print;}" f1 f2
f1123
f2456



QUOTE:
#echo 123 > f1
#echo 456 > f2
#perl -e "while(<>){print $ARGV if bof;print;}" f1 f2
123
123
456
456

上面是我在LINUX环境下的测试结果,楼上的兄弟,这...?