+ -
当前位置:首页 → 问答吧 → 一个关于批处理程序写法的问题,大家帮我看看,我哪写错了,谢谢拉:)

一个关于批处理程序写法的问题,大家帮我看看,我哪写错了,谢谢拉:)

时间:2010-09-18

来源:互联网

本帖最后由 xixizhihua 于 2010-09-18 21:17 编辑

程序的要求是这样:
文件例子:
  goodmorning
  I like the weather
  monday (
  .one (shoping)
  .two (washing)
  .three (cooking)
  .four (sleep)
  );
我要把.two替换成.second
一共有40多个,有类似内容的文件.我需要进行批量替换
并且要把替换次数和对应的文件名,写入一个xxcheck的文件.
在99超人大哥的帮助下,他用perl饼指令帮我实现了,代码如下:
[oracle@imeg02 zgw]$ perl -i -pe '$file{$ARGV}+=s/\.two/.second/;END{foreach (keys %file) {print $_,",",$file{$_},"\n"}}' *.txt >xxcheck
[oracle@imeg02 zgw]$ cat xxcheck
3.txt,5
1.txt,2
2.txt,5
我在工作中,一直这么用,很好,没出现过问题.感谢超人大哥。

最近,我想弄清楚这个程序的结构,就想自己用程序的写法实现,但是,运行时候总出问题。大家帮我看下。
#!/usr/bin/perl

use strict;
use warnings;

BEGIN{$/=";"}
while (<>) {
$file{$ARGV}+=s/\.two/.second/;
print;
}
END{foreach (keys %file) {print $_,",",$file{$_},"\n"}};

然后,我把内容存成xxcs1

然后在目标文件夹内运行$perl xxcs1 *.txt >xxcheck

每次运行都会提示%file require package .....
好象,%file有问题。
但是,在使用perl饼写法的时候,一切正常。
END循环,好象也与在程序中位置没关系,是固定最后执行的。
请各位帮我看看,我的程序到底问题出在哪呢?

另外,对于$file{$ARGV}这个变量的结构,我也没弄清楚。
“小骆驼“书上说$file是变量,@ARGV是数组。
从前面的符号上说,$file{$ARGV}应该是个变量,但这个变量到底表示什么,为什么超人大哥要这么设置,我一直没弄明白。
我原来是设定一个my $rp = 0, 每次匹配成功,$rp ++; 最后输出$rp,不过一直达不到超人大哥程序的效果。

请厉害的高手,帮忙稍微讲下,为什么要用$file{$ARGV}+=s/\.two/.second/;而用$file{$_},"作为输出呢?
以及+=到底是对$file进行了+1,还是对{$ARGV}进行+1?

多谢大家了。

作者: xixizhihua   发布时间: 2010-09-18

你那个报错是因为你没有定义%file这个变量
加上下面这行应该不会报错了
my %file;

找本perl入门的书看完吧,好多问题应该就不是问题了

作者: 99超人   发布时间: 2010-09-19