2017-08-11 111 views
0

陣列perl中的〜意味着什麼?

my @ar = qw(one two); 
print [email protected],"\n"; 
#output 18446744073709551613 

標量(結果是非常有趣)

my $ar = "qw(onetwo)"; 
print ~$ar 
#Output Please refer the screen shot. 

我的問題是什麼~呢?

對於數組,它給出了一些數字。

對於標量它給出了一些其他字符,我們從終端拷貝了字符並粘貼在gedit中,結果是在長空格字符打印後出現倒序。我無法刪除最後的字符。如果我試圖刪除空格,字符會逐個刪除(從左到右)。我無法理解這裏會發生什麼。?

+1

請勿發佈文字圖片。通過'xxd'或'od'輸出輸出來查看實際打印的字節會更好。 –

回答

6

一元~執行按位否定。數字首先通過丟棄小數部分轉換爲整數,然後翻轉二進制表示中的每一位。因此,在64位系統上,你會得到:

$ perl -e 'printf "%x\n", ~0' 
ffffffffffffffff 

雙重否定可用於非負數轉換爲整數的簡潔,但不可讀方式:

$ perl -le 'print ~~1.8' 
1 

在標量評估上下文中,數組產生元素的數量,所以對於兩元素數組,[email protected]等於~2

當對字符串操作,在串的二進制表示的每個比特被翻轉:

$ perl -le 'print unpack("B*", "A"), "\n", unpack("B*", ~"A")' 
01000001 
10111110 

$ perl -le 'print unpack("H*", "onetwo"), "\n", unpack("H*", ~"onetwo")' 
6f6e6574776f 
90919a8b8890 

6fo十六進制的ASCII碼和90是取反後的十六進制值。由於每個字節的MSB被翻轉,所以在打印字符串的按位否定時通常會發生垃圾。

+0

Double'~~'也可以用來施加標量上下文,例如'perl -e'print ~~ localtime'' – mob

1

perldoc manpage

一元 「~」 採取執行位求反,即,1的補數。例如,0666〜& 027是0640.

然而,~操作者有一堆的其它功能,例如操作者=~是用於將正則表達式爲標量。

一般來說,與操作員一起工作是一個相當混亂的考驗,如果您對他們有疑問,我建議您查閱鏈接手冊頁。

+0

@Quentin感謝編輯,我進行了修改。 – Wep0n

4

docs

象徵一元運算符

[...]
一元 「〜」 執行位求反,即,1的補數。例如,0666〜& 027是0640.
[...]

儘管它看起來不同,我假定[email protected]確實元件的數量的在一個@ar按位求反:

print ~2, "\n"; 
18446744073709551613 
+0

'〜'在它的論點上強加了標量上下文(就像'+'做的那樣)。這就是爲什麼它最終會對'@ ar'中的元素數量進行操作。注意,''perl -e'print〜(9,8)''' –