Perl确实功能很方便阿

Perl语言入门(第四版)P79,习题3。

实现功能:对已有的一串数字输入,返回所有大于平均值的数字。
里面构建两个子例程,计算均值的average, 大于均值的above_average.
以下是程序(呵呵,初学者的Perl程序):

#! /usr/bin/perl -w

use strict;

my @fred = &above_average(1..20);
print "above arverage is @fred \n";

my @barney = &above_average(100, 55, 60, 1..10);
print "avove average is @barney\n";

sub average{
    my $count = @_;
    my $sum = 0;
    foreach(@_){
        $sum += $_;
    }
    return $sum / $count;
}

sub above_average{
    my $mean = &average(@_);
    my @newarr;
    my $i = 0;
    foreach(@_){
        if($_ > $mean){
            $newarr[$i++] = $_;
        }
    }
    return @newarr;
}
            

感觉这里面对数组的操作比较简单,不用声明一些临时变量来控制循环的进行,使用默认变量即可执行循环和一些计算,以及他所支持的长度可变的参数列表,都比C省事多了。

当然,偶也只是学到这种水平,难的东西都还没遇上。昨晚的感慨,也是为Perl程序编写和实现的方便而发的。
perl的特点就是偷懒啊,感觉以前perl就是为了方便实现很多小功能设计的
很大的特点也就是接近自然语言,所以给人“他确实实现我想要的,就和我动个脑子一样”这样的感觉
不会像C那样扣,变量要十分严格,每个地方都精心设计,自己需要完成很多细节步骤
当然,c++的库里面。。也很爽。。n多功能现成的

不过嘛,perl给你做了那么多事请,你就要考虑他底层耗费了多少东西了
毕竟说来,perl东西是c写的,就是他为你代劳,为你思考而已

正则用不好,玩死人的


QUOTE:
原帖由 perljoker 于 2007-9-29 13:46 发表
perl的特点就是偷懒啊,感觉以前perl就是为了方便实现很多小功能设计的
很大的特点也就是接近自然语言,所以给人“他确实实现我想要的,就和我动个脑子一样”这样的感觉
不会像C那样扣,变量要十分严格,每个 ...

哈哈,多谢楼上提醒啊。这也就是什么样的工具会更适合哪些方面的工作。用合适的工具做合适的事情。这是目的。



QUOTE:
原帖由 Godbach 于 2007-9-29 13:35 发表
Perl语言入门(第四版)P79,习题3。

实现功能:对已有的一串数字输入,返回所有大于平均值的数字。
里面构建两个子例程,计算均值的average, 大于均值的above_average.
以下是程序(呵呵,初学者的Perl程 ...

There is more than one way to do it.

刚开始时, 代码比较靠近C;
慢慢的, 习惯用perl的方式来解决问题

sub above_average {
    grep { $_ > $mean; } @_;
}


最近偶忙于回头学C++
经常会在if前置后置,{}的有无,函数的前置申明,参数列表
cout和print的混用,#和//的注释
一长串的变量类型申明上犯小错误
sub above_average{
    my $mean = &average(@_);
    grep { $_ > $mean; } @_;


呵呵,这个确实简单阿,受教了。


QUOTE:
原帖由 perljoker 于 2007-9-29 14:25 发表
最近偶忙于回头学C++
经常会在if前置后置,{}的有无,函数的前置申明,参数列表
cout和print的混用,#和//的注释
一长串的变量类型申明上犯小错误

用完了Perl,再去用C很多方式需要转变一下,一开始肯定会不适应的
没有仔细研究C++的string的实现,但感觉不需要传引用。
string一般都是类似字符指针的结构,有的也是加了一个长度的记录而已,我想没有那一个实现会愚蠢的把字符串原样复制一份给传过去,所以传值就可以了。
当然,如果那个大虾考证,string确实是完整拷贝了一次字符串,那么算我说错。


QUOTE:
原帖由 shaver 于 2007-9-29 16:33 发表
没有仔细研究C++的string的实现,但感觉不需要传引用。
string一般都是类似字符指针的结构,有的也是加了一个长度的记录而已,我想没有那一个实现会愚蠢的把字符串原样复制一份给传过去,所以传值就可以了。 ...

C++中函数调用默认传值. 函数内部拿到是一份拷贝.
比如
string str("xxx");
void func(string a) { a = "..."; }
func(str);

函数func操作的a, 其实是类似__a这样名字的一个拷贝来的string变量(编辑器干的事儿, 编译之后能看到)
所以在func(str)之后str并不会发生变化.
(有点扯远了... )


大家清楚Perl中sub的变量传递方式就行了.
c/c++的参数传递的,本来就是一个拷贝后的副本,对副本的修改,肯定不会影响到正本,这个是自然。
但是这样也增加了传递的开销。所以有一个说法,对于多于四个字节的结构体,或自定义类型,都应该采用传指针或传引用的方式,如果需要避免被修改,就用const修饰。
但是我觉得对string不需要这样做(前面那位用的const string &)。我记得delphi的string的实现,采用了写时拷贝的技术,就是复制的时候,并没有完整拷贝整个字符串,而是对字符串增加了一次引用而已,直到需要修改的时候,才进行完整拷贝字符串的操作,所以传递的开销并不大。C++的实现也想也应该类似。