论坛: 编程破解 标题: perl中很BT的一个语句 复制本贴地址    
作者: NetDemon [netdemon]    ADMIN   登录
考考大家

sub func {
$a <=> $b;
}

你知道这个函数怎么用么?嗬嗬~~~


[此贴被 NetDemon(netdemon) 在 08月12日14时10分 编辑过]

地主 发表时间: 08/12 14:06

回复: Aoming [aoming]   版主   登录
-1,0,1
喝醉酒用来猜拳不错
哎~~思路打不开啊,老大指点



[此贴被 Aoming(aoming) 在 08月13日01时22分 编辑过]

B1层 发表时间: 08/13 01:34

回复: tommy_he [tommy_he]   版主   登录
不大明白,老大指点以下吧!
不过我还是希望学了 JAVA先,但是不知道哪里有下的!找了很久了!
谁知道啊!?

B2层 发表时间: 08/13 04:55

回复: allyesno [allyesno]   论坛用户   登录
还没看到关于这个函数的章节。。。

B3层 发表时间: 08/13 10:38

回复: NetDemon [netdemon]   ADMIN   登录
改一下自定义函数的名字

sub by_number{
$a <=> $b;
}

这样大概可以猜一下大的方向了

明天再把应用的代码发上

B4层 发表时间: 08/13 12:48

回复: Garu [syshunter]   版主   登录
是不是交换两个值的?

B5层 发表时间: 08/13 13:28

回复: Aoming [aoming]   版主   登录
还是早点贴代码吧,光给一个by_number的提示脑细胞用光还是猜想不到,要有得经验才行,各个程序员编程习惯都不会全部相同的。
你用2个变量比较,函数返回3个可能的值-1,0,1
用来喝酒猜拳还可以,左手、空、右手
哎,不猜了,这个就象把一只手从人身上砍了,那也就不叫手没有其手的功能了

B6层 发表时间: 08/14 09:41

回复: maomao520 [maomao520]   论坛用户   登录
对啊,是不是 两个数值转换?

B7层 发表时间: 08/16 14:46

回复: NetDemon [netdemon]   ADMIN   登录
open(FH,"$path_to_click_file");
@click = <FH>;
close(FH);

@sorted = sort by_number @click;

for ($i=0;$i < 10; $i++){
push(@topten,$sorted[$i]);
}

foreach(@topten){
my($click,$url,$name)=split(/\|/,$_ );
print "< a href = \"$url\">$name</a> ($click)<br>\n"; 
}

参考20CN软件下载的《下载排行》


现在是否明白


B8层 发表时间: 08/16 18:52

回复: tommy_he [tommy_he]   版主   登录
呵呵,大概明白了!

B9层 发表时间: 08/16 19:22

回复: Aoming [aoming]   版主   登录
其实代码简化一下就是这样:
-----------------------------------
sub by_number {
 $a <=> $b;
 print "now    \$a = $a\t \$b = $b\n";
}

@click =("1","2","3","4","5","6");
@sorted = sort by_number @click;

for ($i=0;$i < @sorted; $i++) {
 print "$sorted[$i] → "; 
}
------  执行后的显示 ----------
now    $a = 1    $b = 2
now    $a = 3    $b = 4
now    $a = 5    $b = 6
now    $a = 2    $b = 4
now    $a = 2    $b = 3
now    $a = 4    $b = 6
now    $a = 4    $b = 5
6 → 5 → 4 → 3 → 2 → 1 →
-------------------------------

感觉sub本身没有什么特别的,代码NB在那个sort sub list语句
引用:

sort

Syntax

Category  list operator (list)
Arguments  subname list
Arguments  block list
Arguments  list
Return Value  list

Definition

This function sorts the list specified and returns the sorted list. The sort method can be specified with the 
optional subroutine
 or block argument. A subroutine may be specified that takes two arguments (passed as 
global package variables, $a $b) and returns TRUE if the first is less than or equal to the second by any criteria used. 

Similarly, a block can be specified (effectively an anonymous subroutine) to perform this function. The default sort 
order is based on the standard string comparison order. 


字面上看“sort函数可以被一段任选的子程序指定”“子程序被指定2个结果(通过全局变量 $a 和 $b传递)并且当第一个小于或等于第二个时返回TRUE”
说实在的,虽然让perl将比较过程列出来了,可是参数栈操作的过程我一直是淅沥糊涂的,没好好琢磨过。。。
-o- 
悔过中。。。。下线~~6了

B10层 发表时间: 08/18 06:25

回复: NetDemon [netdemon]   ADMIN   登录
很明显,Aoming你错的一塌糊涂了

你这个代码执行后的结果是这样的:
------------------------------
now    $a = 2    $b = 1
now    $a = 3    $b = 2
now    $a = 4    $b = 3
now    $a = 5    $b = 4
now    $a = 6    $b = 5
1 → 2 → 3 → 4 → 5 → 6 →
------------------------------

就是说:@sorted=@click 并原封不动的print出来

那我们现在改一下@click的内容:

@click =("1","2","3","8","7","4","5","6");

那么运行后的显示:
--------------------------------
now    $a = 3    $b = 8
now    $a = 8    $b = 7
now    $a = 2    $b = 8
now    $a = 8    $b = 4
now    $a = 1    $b = 8
now    $a = 8    $b = 5
now    $a = 8    $b = 6
now    $a = 1    $b = 2
now    $a = 3    $b = 1
now    $a = 4    $b = 5
now    $a = 7    $b = 4
now    $a = 6    $b = 7
5 → 4 → 7 → 6 → 8 → 2 → 1 → 3 → 
----------------------------------
这很明显你自己都无法预料为什么是这样的结果

你这个代码,为了得到正确的结果:
代码要这么修改:

@click =("1","2","3","8","7","4","5","6");
@sorted = sort @click;

for ($i=0;$i < @sorted; $i++) {
 print "$sorted[$i]  →";
}
这样的结果才是:
1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 → 

就是说,那个sub根本就不能用,用了就得不到正确的结果的。

为什么呢?嘎嘎~~继续想


B11层 发表时间: 08/18 09:28

回复: Aoming [aoming]   版主   登录
日ing~~~中计了啊~~~~~
回头再来,又一宿没睡了:)
Mandrake9.1配了KDE3,感觉不错,哈哈

===================
另外,老大,顺便提下子,你那个运行结果怎么搞出来的?我到linux下运行同样的脚本输出却不同?perl都是v5.8.0的来,搞不懂了,睡了睡了
now    $a = 1    $b = 2
now    $a = 3    $b = 4
now    $a = 5    $b = 6
now    $a = 2    $b = 4
now    $a = 2    $b = 3
now    $a = 4    $b = 6
now    $a = 4    $b = 5
只有着上面的,程序最后一个语句无输出:(
眼皮极度打架中。。。先闪了

[此贴被 Aoming(aoming) 在 08月18日10时57分 编辑过]

B12层 发表时间: 08/18 10:07

回复: kert_t8 [kert_t8]   论坛用户   登录
@sorted=sort{return (1) if ($a>$b);
return (0) if ($a==$b);
return (-1) if ($a<$b)} @click;

呵呵

B13层 发表时间: 08/19 11:45

回复: kert_t8 [kert_t8]   论坛用户   登录
刚刚看到这里,所以就~~~

另外,bt是什么意思啊?

B14层 发表时间: 08/19 11:49

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号