2010-11-13 39 views
21

我目前瞭解Perl中「提領」和需要你的幫助理解什麼「\」是指在下面的行..在Perl中''是什麼意思?

$ra = \$a; 
+4

如果你正在學習一下吧,有什麼事您的書籍和手冊說? – Ether 2010-11-13 16:39:59

+2

我的講稿沒有詳細說明它是什麼意思,導致我在谷歌搜索。沒有找到滿意的答案,所以我在這裏問了。 – Roy 2010-11-13 16:46:48

+1

@羅伊:確保你選擇了正確的答案。 ☹ – tchrist 2010-11-13 16:59:50

回答

18

perlop

一元「\」創建一個引用 後面的任何內容。請參閱perlreftutperlref。不要將此 行爲與 反斜槓行爲混淆在一個字符串中,儘管 兩種形式都確實傳達了保護 插值的下一件事的概念。

+4

實際上,或者在列表上下文中創建幾個引用,例如* @r = \\(@ a,%b,&c)'和'@r = \ localtime'。 – tchrist 2010-11-13 16:58:55

+0

當在正則表達式或字符串中存在反斜槓「\」時,它被稱爲ESCAPE,否則它被稱爲REFERENCE – jjpcondor 2012-09-01 06:09:40

1

它在右側創建對變量的引用;有點像C中的指針(沒有指針算術)或Java中的指針。

有關該主題的更多信息,請參閱perldoc perlref

Dereferentiation通過$$a做了標量,@$a爲陣列等

+1

@tchrist這個答案沒有錯。它並沒有完全告訴你做什麼,但問題不是「操作員在所有情況下都做了什麼」,而是「在下面的行中是什麼」。下面的行是'$ ra = \ $ a;',並且在那一行它確實創建了右側變量的引用。答案還提供了一份完整解釋操作員的參考文件。 – 2010-11-13 17:23:05

+0

@Chas。歐文斯:這個問題的標題是一個不完整的答案。 – tchrist 2010-11-13 17:45:06

+0

很好,我猜'$ ra = \ $ a;'在右邊的變量的引用不會被創建;然後P – mfontani 2010-11-14 09:00:26

4

Perl文檔是偉大的,徹底的,及早並經常使用它。我可以推薦perldoc perlreftut,perl參考教程或perldoc perlref瞭解更多信息。然後perldoc perlintroperldoc perltocperldoc perl看到哪裏去。

是的,它創建了變量$ a的引用並將其存儲在變量$ ra中。

24

正如我在其他地方以前寫的...

一元\創建到任何遵循它的參考。用在列表上,它創建一個引用列表。

不要把這種行爲與字符串中反斜槓的行爲混爲一談,儘管這兩種形式確實傳達了保護下一件事情與解釋有關的模糊的否定概念。這種相似並不完全是偶然的。

您可以使用反斜槓創建對任何指定變量或子例程的引用。您也可以將其用於匿名標量值,如7"camel",但您通常不需要。至少乍一看,該操作員的工作方式類似於C或C++中的&(地址)操作員。

下面是一些例子:

$scalarref = \$foo; 
$constref = \186_282.42; 
$arrayref = \@ARGV; 
$hashref = \%ENV; 
$coderef = \&handler; 
$globref = \*STDOUT; 

反斜槓操作者可以做的比產生一個單一的參考。如果應用於列表,它將生成一個完整的參考列表。

如前所述,反斜槓運算符通常用於單個對象以生成單個引用,但它不一定是。當在指示對象列表上使用時,它會產生一個對應參考列表。以下示例的第二行與第一行做同樣的事情,因爲反斜槓自動分佈在整個列表中。

@reflist = (\$s, \@a, \%h, \&f);  # List of four references 
@reflist = \($s, @a %h, &f);  # Same thing 

如果一個圓括弧列表包含恰好一個陣列或散列,那麼其所有值進行內插,並給每個引用返回:

@reflist = \(@x);     # Interpolate array, then get refs 
@reflist = map { \$_ } @x;   # Same thing 

這也時有內部括號發生:

@reflist = \(@x, (@y));    # But only single aggregates expand 
@reflist = (\@x, map { \$_ } @y); # Same thing 

如果您使用散列嘗試此操作,則結果將包含對值的引用(如您所期望的),但引用副本的鍵(如你可能不是預計)。

由於數組和哈希切片實際上只是列表,因此您可以反斜線切片以獲取參考列表。接下來的每一個四行的不完全一樣的東西:

@envrefs = \@ENV{"HOME", "TERM"};   # Backslashing a slice 
@envrefs = \@ENV{ qw<HOME TERM> };  # Backslashing a slice 
@envrefs = \($ENV{HOME}, $ENV{TERM}); # Backslashing a list 
@envrefs = (\$ENV{HOME}, \$ENV{TERM}); # A list of two references 

因爲函數可以返回列表,你可以申請一個反斜槓給他們。如果你有一個以上的函數來調用,第一插值每個函數的返回值放入一個更大的列表,然後反斜線整個事情:

@reflist = \fx(); 
@reflist = map { \$_ } fx();    # Same thing 

@reflist = \(fx(), fy(), fz()); 
@reflist = (\fx(), \fy(), \fz());   # Same thing 
@reflist = map { \$_ } fx(), fy(), fz(); # Same thing 

反斜線操作者總是提供了一個列表環境的操作,所以這些功能所有在列表上下文中調用。如果反斜槓本身是在標量上下文,你會通過函數返回列表的最後一個值的參考結束:

@reflist = \localtime();  # Ref to each of nine time elements 
$lastref = \localtime();  # Ref to whether it’s daylight savings time 

在這一點上,反斜線行爲類似於Perl的命名列表 運營商,例如print,reversesort,其總是 在其右側提供列表上下文,而不管左側可能發生什麼。至於命名列表操作,使用一個明確的scalar迫使接下來到標量上下文:

$dateref = \scalar localtime(); # \"Sat Nov 13 10:41:30 2010" 

現在你知道...這個故事的其餘

(與道歉已故的保羅·哈維)

+2

我剛剛使用了DATA和\\ * DATA的引用來使用帶LaTeX的Template :: Toolkit。我把LaTeX部分放在DATA部分,然後用'process'中的模板引用:Perl非常酷。 – 2010-11-13 17:27:07

+2

同樣感謝你們展示\\(...)分發,爲每個元素創建一個ref。我會猜想這會列出這個列表的數組,但現在這是有道理的,否則我們需要什麼。謝謝 – 2010-11-13 17:31:25

+1

這是非常全面的,這是tchrist。 – Roy 2010-11-13 17:31:53