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

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 14816 | 回復: 6
打印 上一主題 下一主題

關于perl當中字符串轉(zhuǎn)換成數(shù)字的疑問 [復制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2011-11-25 15:23 |只看該作者 |倒序瀏覽
剛剛開始學習perl,感覺perl語言中遇到操作符時字符串轉(zhuǎn)化成數(shù)字太靈活了,所以產(chǎn)生了疑問,請幫忙

舉例:
case 1
#############################
use strict;
use 5.10.1;
use feature qw(say);

my $var = "12";
$var + 0;

if ( $var ~~ '12.0' ) {
        say "matched";
} else {
        say "not matched";
}
#############################
結(jié)果是matched,因為$var + 0 將其有字符串轉(zhuǎn)化成了數(shù)字,并且perl自動將此結(jié)果保存給變量 var

case 2
#############################
use strict;
use 5.10.1;
use feature qw(say);

my $var = "12a";
$var + 0;
print "$var\t";

if ( $var ~~ '12.0' ) {
        say "matched";
} else {
        say "not matched";
}
#############################
這次結(jié)果是12a    not matched,說明12a沒有被轉(zhuǎn)換成數(shù)字。

case 3
#############################
use strict;
use 5.10.1;
use feature qw(say);

my $var = "12a" + 0;
#$var + 0;
print "$var\t";

if ( $var ~~ '12.0' ) {
        say "matched";
} else {
        say "not matched";
}
#############################
這次結(jié)果是12    matched,說明12a被轉(zhuǎn)換成了數(shù)字12


問題出來了,為什么第二種情況perl 不會將其轉(zhuǎn)換成數(shù)字12? 然后保存這個值再去和‘12.0’ 進行比較?
能說明情況二和情況一,三的區(qū)別嗎?

論壇徽章:
46
15-16賽季CBA聯(lián)賽之四川
日期:2018-03-27 11:59:132015年亞洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49雙魚座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亞冠之布里斯班獅吼
日期:2015-07-13 10:44:56
2 [報告]
發(fā)表于 2011-11-25 16:44 |只看該作者
這里用到了 smart match 的這兩個規(guī)則

   Num     numish numeric equality       $a == $b
    Any     Any       string equality          $a eq $b


一個字符串如果進行了數(shù)學運算會保存起相應的數(shù)字值,如果它是個合法的數(shù)字則值會被標記為可以用為數(shù)字,在 smart match 這里只檢測可用的類型。

Scalar::Util::dualvar 這個函數(shù)可以讓一個值同時可以用為數(shù)字和字符串,而且不需要有任何關系,你可以試下

$a = dualvar 33, 'abc';
$a ~~ 33; $a ~~ /abc/ 都為真。以往 Perl 都是通過操作符來選擇使用哪種類型的,而 smart match 作為后來者邏輯上的確有瑕疵

論壇徽章:
0
3 [報告]
發(fā)表于 2011-11-25 17:16 |只看該作者
謝謝,我明白問題出在了智能匹配上面。

perl的標量類型有字符串和數(shù)字兩種,什么時候是字符串還是數(shù)字?這是由語句的上下文區(qū)分的。perl有字符串上下文,也有數(shù)字上下文,取決于出現(xiàn)的操作符。
+ ,- ,* ,/ ,== ,>= 這些都是數(shù)字操作符,因而期望前后出現(xiàn)數(shù)字上下文;
eq,gt,.,lt 這些都是字符串操作符,因而期望出現(xiàn)字符串上下文。
而智能匹配~~ 比較奇特,他會根據(jù)左右出現(xiàn)的上下文再去決定是數(shù)字上下文還是字符串上下問,這就使得問題有些時候更加奇特乃以理解了。

我的問題,我個人的理解如下:
####################
case 1
####################
my $var = "12";            #var是字符串變量
$var + 0;                      #var轉(zhuǎn)換中字符串成了數(shù)字12
if ( $var ~~ '12.0' ) {    #這個時候智能匹配選擇數(shù)字上下文 12 == 12, TRUE
####################
case 2
####################
my $var = "12a";          #var是字符串變量
$var + 0;                      #var轉(zhuǎn)換中字符串成了數(shù)字12
if ( $var ~~ '12.0' ) {    #這個時候智能匹配選擇字符串上下文 12 eq 12.0, FALSE
####################
case 3
####################
my $var = "12a" + 0;   #var是數(shù)字變量12

if ( $var ~~ '12.0' ) {    #這個時候智能匹配選擇數(shù)字上下文 12 == 12.0, TRUE
####################


勞煩版主,幫助檢查,謝謝!

論壇徽章:
145
技術(shù)圖書徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11獅子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龍
日期:2014-01-08 15:26:12技術(shù)圖書徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
4 [報告]
發(fā)表于 2011-11-25 17:34 |只看該作者
回復 3# perlming


>>my $var = "12a";          #var是字符串變量
>>$var + 0;                      #var轉(zhuǎn)換中字符串成了數(shù)字12
>>if ( $var ~~ '12.0' ) {    #這個時候智能匹配選擇字符串上下文 12 eq 12.0, FALSE

你理解錯了.....
$var + 0  #并不會改變$var 內(nèi)容(還是"12a")

12a    not matched   #"12a" eq "12.0" 當然不會成功...

論壇徽章:
0
5 [報告]
發(fā)表于 2011-11-25 18:10 |只看該作者
多謝,剛剛注意到了,呵呵。

引入了我的另外兩個新問題
1)如何判斷智能匹配語法上下文 是數(shù)字上下文還是字符串上下文呢?
我個人覺得最容易理解case 3
####################
my $var = "12a" + 0;   #var是數(shù)字變量12
if ( $var ~~ '12.0' ) {    #這個時候智能匹配選擇數(shù)字上下文 12 == 12.0,轉(zhuǎn)換‘12.0’到數(shù)字12

case 1
####################
my $var = "12";            #var是字符串變量
$var + 0;                      #var轉(zhuǎn)換中字符串成了數(shù)字12, var有了兩種屬性(我簡稱它為屬性),數(shù)字12和字符串‘12’
if ( $var ~~ '12.0' ) {    #這個時候智能匹配選擇數(shù)字上下文 12 == 12,??奇怪了為什么選擇數(shù)字上下文而不是字符串上下文 ‘12’ eq ‘12.0’呢??

case 2
####################
my $var = "12a";          #var是字符串變量
$var + 0;                      #var轉(zhuǎn)換中字符串成了數(shù)字12,var有了兩種屬性,數(shù)字12和字符串‘12a’
if ( $var ~~ '12.0' ) {    #這個時候智能匹配選擇字符串上下文 ‘12a’ eq ‘12.0’, ??奇怪為什么不選擇數(shù)字上下文了呢??

2)另外我還有一個困惑的問題就是版主提出的dualvar,這個變量到底存儲的是數(shù)字變量還是字符串變量,還是都存儲然后根據(jù)上下文情景再去選擇?
我寫了一個測試代碼如下:
#######################
use Devel:eek qw(Dump);
use Scalar::Util qw(dualvar);
use strict;

my $var1 = 34;
my $var2 = "dbc";
my $var3 = dualvar 34,'dbc';
my $var4 = "34dbc";
Dump($var1);
Dump($var2);
Dump($var3);
$var4 + 0;
Dump($var4);
#######################
結(jié)果為
SV = IV(0x182afd0) at 0x182afd4
  REFCNT = 1
  FLAGS = (PADMY,IOK,pIOK)
  IV = 34  <=== 100%數(shù)字變量
SV = PV(0x287044) at 0x182b084
  REFCNT = 1
  FLAGS = (PADMY,POK,pPOK)
  PV = 0x28f8cc "dbc"\0  <====100%字符串變量
  CUR = 3
  LEN = 4
SV = PVNV(0x288a6c) at 0x182b004
  REFCNT = 1
  FLAGS = (PADMY,IOK,POK,pIOK,pPOK)
  IV = 34      ??50%數(shù)字變量??
  NV = 0
  PV = 0x186b05c "dbc"\0    ??50%字符串變量??
  CUR = 3
  LEN = 4
Argument "34dbc" isn't numeric in addition (+) at test.pl line 12.
SV = PVNV(0x288a54) at 0x182b034
  REFCNT = 1
  FLAGS = (PADMY,POK,pIOK,pNOK,pPOK)
  IV = 34
  NV = 34  <===這里和變量三又不太一樣
  PV = 0x1824b8c "34dbc"\0
  CUR = 5
  LEN = 8
######################
注意到其中的PV,IV,NV字段有些不同,可以幫我理解嗎?謝謝

論壇徽章:
46
15-16賽季CBA聯(lián)賽之四川
日期:2018-03-27 11:59:132015年亞洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49雙魚座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亞冠之布里斯班獅吼
日期:2015-07-13 10:44:56
6 [報告]
發(fā)表于 2011-11-25 18:40 |只看該作者
多謝,剛剛注意到了,呵呵。

引入了我的另外兩個新問題
1)如何判斷智能匹配語法上下文 是數(shù)字上下文還 ...
perlming 發(fā)表于 2011-11-25 18:10



    一個 scalar 可以有 整數(shù)、浮點數(shù)、字符串幾個槽,所以它可以同時是這幾種類型,這取決于 IOK NOK POK 這幾個標志位。遇到你第二個例子必然要由實現(xiàn)決定是選 Num     numish 還是  Any     Any,當然也可能全都進行

論壇徽章:
0
7 [報告]
發(fā)表于 2011-11-28 09:19 |只看該作者
謝謝,周末沒上網(wǎng),剛剛看到。一口氣吃不了個胖子,多看多練,慢慢體味吧。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP