local $^I = '.bac' 中$^是什么意思!

local $^I = '.bac' 中$^是什么意思!

# cat  /home/jiangt/perl/file.txt

192.168.1.1
192.168.1.1
200.1.1.2
201.43.43.1
10.0.0.1
200.1.1.2
192.168.1.1


#!/usr/bin/perl -v

use strict;
use warnings;

my $file = '/home/jiangt/perl/file.txt';
my %seen = ();
{
  local @ARGV = ($file);
  local $^I = '.bac';
  while(<>){
     $seen{$_}++;
     next if $seen{$_} > 1;
     print;
  }
}
foreach my $keys  ( sort {$seen{$b} <=> $seen{$a}} keys %seen) {
  print "$keys = $seen{$keys}";
}
http://bbs.chinaunix.net/viewthr ... &extra=page%3D1
$^I 是 Perl 预定义的特殊变量,见 perlvar 对其的描述。
$^I     原地编辑扩展的当前值。设置为 "undef" 时关闭原地编辑。(助记:-i
            开关的值。)
慢慢理解中


QUOTE:
原帖由 huanghaojie 于 2009-1-6 14:23 发表
$^I     原地编辑扩展的当前值。设置为 "undef" 时关闭原地编辑。(助记:-i
            开关的值。)
慢慢理解中

看看 perlrun 中对 -i 的描述相信会有帮助


QUOTE:
原帖由 MMMIX 于 2009-1-6 14:48 发表

看看 perlrun 中对 -i 的描述相信会有帮助

去看看, 能大概描述一下这段程序吗


QUOTE:
原帖由 huanghaojie 于 2009-1-6 15:57 发表


去看看, 能大概描述一下这段程序吗

直接说你什么地方不理解吧
local @ARGV = ($file);
  local $^I = '.bac';
  while(<>){
     $seen{$_}++;
     next if $seen{$_} > 1;
     print;

1.这段不太清楚
2.我把local 换成my行吗
3.($file) 括号不要行吗
4.


QUOTE:
原帖由 huanghaojie 于 2009-1-6 16:08 发表
local @ARGV = ($file);
  local $^I = '.bac';
  while(){
     $seen{$_}++;
     next if $seen{$_} > 1;
     print;

1.这段不太清楚

具体什么地方不清楚?

QUOTE:
2.我把local 换成my行吗

不行。用 my 会创建一个局部变量,不会对 $^I 这些全局变量造成影响。

详见 perlsub 中的描述。

QUOTE:
3.($file) 括号不要行吗

可以。在 perldata 的 List value constructors 中有描述。


QUOTE:
原帖由 MMMIX 于 2009-1-6 17:13 发表

具体什么地方不清楚?

不行。用 my 会创建一个局部变量,不会对 $^I 这些全局变量造成影响。

详见 perlsub 中的描述。

可以。在 perldata 的 List value constructors 中有描述。

搞明白了,但有一个地方有点不清楚, 就是print 这个光秃秃的print 打印$_到file.txt吗,


还有一个地方就是最后一句
foreach my $keys  ( sort {$seen{$b} <=> $seen{$a}} keys %seen) {
  print "$keys = $seen{$keys}\n";
}

打印出来的为什么是这样
192.168.1.1
= 3
200.1.1.2
= 2
201.43.43.1
= 1
10.0.0.1
= 1

为什么不是下面那样
192.168.1.1  = 3
200.1.1.2  = 2
201.43.43.1 = 1
10.0.0.1  = 1