亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: 【再次求解】一個(gè)幾天前讓我出bug的函數(shù) [打印本頁(yè)]

作者: yiten    時(shí)間: 2010-11-13 15:24
標(biāo)題: 【再次求解】一個(gè)幾天前讓我出bug的函數(shù)
這里我就只寫(xiě)一個(gè)原型
use warnings;
use strict;
use Data:umper;
use Time::HiRes;

sub foo {
    for my $i ( 1..5 ) {
        my $bar = 2 if $i == 2;
        
        if ( !defined($bar) ) {
            $bar = 4 if $i % 2;
        }
        
        print $bar || '', "\n";
    }
}

foo();

這個(gè)輸出應(yīng)該是什么呢:
4
2
4
4
4
還是
4
2
4

4
為什么?
作者: yiten    時(shí)間: 2010-11-13 15:26
如果這樣寫(xiě)
sub foo {
    for my $i ( 1..5 ) {
        my $bar;
        $bar = 2 if $i == 2;
        
        if ( !defined($bar) ) {
            $bar = 4 if $i % 2;
        }
        
        print $bar || '', "\n";
    }
}

foo();

輸出肯定是比較明確的
作者: iamlimeng    時(shí)間: 2010-11-13 16:14
一樓的程序,肯定有問(wèn)題,在$bar沒(méi)有定義的情況下,用!defined($bar)判斷,容易出錯(cuò)很正常,是你自己的邏輯錯(cuò)誤,程序結(jié)果并沒(méi)錯(cuò)。

在$i為1時(shí),你將全局變量(因?yàn)槟闶孪炔](méi)有聲明這個(gè)變量)$bar的值變成了4,$1為2時(shí),my $bar生效,變?yōu)?,雖然名稱(chēng)相同,但它只是在FOR內(nèi)的局部變量,并沒(méi)有覆蓋全局變量,所以$1為3,4,5時(shí),print $bar 的輸出都是全局變量$bar的值。
作者: yiten    時(shí)間: 2010-11-13 16:19
但是我用了use strict,沒(méi)有聲明的全局變量是允許的嗎?
如果這樣允許的話(huà),那說(shuō)明use strict還是有缺陷的
作者: iamlimeng    時(shí)間: 2010-11-13 16:28
use strict并非萬(wàn)能,my $bar = 2 if $i == 2這里可能讓它誤認(rèn)為聲明了吧,養(yǎng)成好習(xí)慣,出錯(cuò)的概率就會(huì)降低很多。

水平有限,說(shuō)不出所以然,請(qǐng)樓下的高手解釋。
作者: yiten    時(shí)間: 2010-11-13 16:33
我也是覺(jué)得my $bar = 2 if $i == 2對(duì)use strict使了障眼法。
這個(gè)bug我曾經(jīng)頭疼了很久,后來(lái)終于查出來(lái)了,呵呵。
作者: zhlong8    時(shí)間: 2010-11-13 19:25
本帖最后由 zhlong8 于 2010-11-13 20:17 編輯

很簡(jiǎn)單,這樣用根本就是錯(cuò)的,文檔說(shuō)的很清楚。ActivePerl 自帶的 perlcritic 可以檢查這種錯(cuò)誤,而 strict 查檢末聲明變量是在編譯期進(jìn)行的。

perlsyn
NOTE: The behaviour of a my statement modified with a statement modifier conditional or loop construct (e.g. my $x if ... ) is undefined. The value of the my variable may be undef, any previously assigned value, or possibly anything else. Don't rely on it. Future versions of perl might do something different from the version of perl you try it out on. Here be dragons.

作者: yiten    時(shí)間: 2010-11-15 14:35
看說(shuō)明是說(shuō)perl也還沒(méi)定對(duì)于這個(gè)寫(xiě)法該怎么處理。
所以其實(shí)應(yīng)該歸于perl的一個(gè)缺陷,他應(yīng)該明確該怎么處理,如果確定不那么處理,就告訴我那樣寫(xiě)是錯(cuò)的。
作者: flw    時(shí)間: 2010-11-15 14:52
看說(shuō)明是說(shuō)perl也還沒(méi)定對(duì)于這個(gè)寫(xiě)法該怎么處理。
所以其實(shí)應(yīng)該歸于perl的一個(gè)缺陷,他應(yīng)該明確該怎么處理 ...
yiten 發(fā)表于 2010-11-15 14:35

未定義行為這個(gè)術(shù)語(yǔ)很常見(jiàn)吧。
作者: jason680    時(shí)間: 2010-11-15 15:02
看說(shuō)明是說(shuō)perl也還沒(méi)定對(duì)于這個(gè)寫(xiě)法該怎么處理。
所以其實(shí)應(yīng)該歸于perl的一個(gè)缺陷,他應(yīng)該明確該怎么處理 ...
yiten 發(fā)表于 2010-11-15 14:35


如果你要的是解釋...樓上的幾位都指出來(lái)了......
由其最后一句: "Here be dragons"


如果你要解決真正的問(wèn)題.....

There's more than one way to do it

重述你(真正)的問(wèn)題? (你要的功能或結(jié)果)

我們可以找更好,更不會(huì)出錯(cuò)的方法......
作者: zhlong8    時(shí)間: 2010-11-15 15:15
本帖最后由 zhlong8 于 2010-11-15 15:28 編輯

我也好奇為什么這個(gè)不發(fā)出警告,可能還沒(méi)商量好判斷條件吧,比如是否只要出現(xiàn) my 就警告,還是下面用了才警告,那下面使用的語(yǔ)句如果被優(yōu)化沒(méi)了呢?如果左側(cè)是 do 或者 eval 怎么處理,如果是逗號(hào)分開(kāi)的很多表達(dá)式呢?總之我覺(jué)得實(shí)現(xiàn)起來(lái)挺麻煩的,而且意見(jiàn)很難統(tǒng)一

方便的后綴語(yǔ)法代價(jià)就是這里的歧意,末定義可能是目前最好的解釋吧

畢竟每個(gè)真正的 perler 都需要去讀下 perlsyn,也不算什么大過(guò)錯(cuò)吧
作者: yiten    時(shí)間: 2010-11-15 15:30
如果你要的是解釋...樓上的幾位都指出來(lái)了......
由其最后一句: "Here be dragons"


如果你要解決 ...
jason680 發(fā)表于 2010-11-15 15:02


是的,現(xiàn)在我知道這個(gè)是dragons的,我知道了我以后也不會(huì)這么用了。
但是還有很多人還不知道是dragons的(難道只有我不知道?),而且也不知道還有哪些是dragons的。
所以,我要說(shuō)的是perl應(yīng)該盡量的避免類(lèi)似的dragons否則,我只能說(shuō)是perl的缺陷。雖然我也很喜歡perl。
作者: zhlong8    時(shí)間: 2010-11-15 15:41
本帖最后由 zhlong8 于 2010-11-15 15:48 編輯

回復(fù) 12# yiten


    print 的語(yǔ)法一直被人罵,像 print $a+1; print ($a+1); print +$a+1; 等等,可是卻都不提 perl 可以省略函數(shù)調(diào)用的括號(hào)節(jié)省的精力;罵 $%@ 卻不提變量可以方便的插入字符串中。這里也一樣有些東西是需要代價(jià)的。

    perl 有些方面對(duì)初學(xué)者不是很友好,但是一般都是有原因的。Perl 5 發(fā)展了十幾年,增加了多少特性和語(yǔ)法卻仍然保持向前兼容,有些修修補(bǔ)補(bǔ)和出人意料的地方是很正常的,畢竟設(shè)計(jì)者都是好意。

    順便扯下,看 maillist 里面關(guān)于添加特性的討論都很有意思,在保持兼容的情況下想法真是千奇百怪的,前兩天居然討論要搞個(gè)操作符 &&->
作者: yiten    時(shí)間: 2010-11-15 16:10
我記得wantarray行為在不同版本的perl也有些差異




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2