2011-12-16 66 views
2

我需要一些幫助解碼這個Perl腳本。 $ dummy不會在腳本的任何其他地方用任何東西初始化。腳本中以下行意味着什麼?以及爲什麼當分割函數沒有任何參數時呢?

($dummy, $class) = split; 

該程序試圖檢查一個聲明是真實還是謊言使用一些統計分類方法。因此,讓我們說它計算並給出以下數字「真實性」和「虛假性」,然後檢查測謊儀是否正確。

# some code, some code... 
$_ = "truth" 
# more some code, some code ... 

$Truthsity = 9999 
$Falsity = 2134123 

if ($Truthsity > $Falsity) { 
    $newClass = "truth";  
} else { 
    $newClass = "lie";  
} 

($dummy, $class) = split; 

if ($class eq $newClass) { 
    print "correct"; 
} elsif ($class eq "true") { 
    print "false neg"; 
} else { 
    print "false pos" 
} 
+2

`(民主,$類)=分裂 「」,$ _`和`$類=(分裂 「」, $ _)[1]`等同於'($ dummy,$ class)= split`(好吧,只要沒有人去,並且開始使用`$ dummy`) – hobbs 2011-12-16 21:11:49

+1

`perldoc -f split` – 2011-12-16 21:20:21

+0

啊是的,我發現在代碼 – alvas 2011-12-16 21:51:02

回答

5
($dummy, $class) = split; 

Split返回一個值數組。第一個輸入$dummy,第二個輸入$class,並且忽略任何其他值。第一個arg很可能被命名爲dummy,因爲作者計劃忽略該值。更好的選擇是使用undef來 忽略返回的條目:(undef, $class) = split;

perldoc可以告訴你如何拆分函數。當沒有參數的情況下調用時,split將對$_進行操作並在空白處分割。 $_是perl中的默認變量,將其視爲上下文定義的隱含「it」。

使用隱含的$ _可以使簡碼更簡潔,但在較大的塊中使用它的方式很差。您不希望讀者對您想要使用的「它」感到困惑。

split ;      # split it 
for (@list) { foo($_) }  # look at each element of list, foo it. 
@new = map { $_ + 2 } @list ;# look at each element of list, 
          # add 2 to it, put it in new list 
while(<>){ foo($_)}   # grab each line of input, foo it. 

perldoc -f split

如果EXPR被忽略,拆分$ _字符串。如果PATTERN也被省略,則在 空白處跳過(在跳過任何前導空格之後)。任何匹配PATTERN 的內容都被視爲分隔字段的分隔符。 (請注意,分隔符 可能比一個字符長。)

我是三元運算符? :的忠實粉絲,用於設置字符串值以及將邏輯推入塊和子例程。

my $Truthsity = 9999 
my $Falsity = 2134123 

print test_truthsity($Truthsity, $Falsity, $_); 

sub test_truthsity { 
    my ($truthsity, $falsity, $line) = @_; 
    my $newClass = $truthsity > $falsity ? 'truth' : 'lie'; 
    my (undef, $class) = split /\s+/, $line ; 

    my $output = $class eq $newClass ? 'correct' 
      : $class eq 'true' ? 'false neg' 
      :      'false pos'; 
    return $output; 
} 

此版本中可能存在微妙的錯誤。沒有參數的splitsplit(/\s+/, $_)不完全相同,如果行以空格開始,它們的行爲將有所不同。在完全限定的拆分中,返回空白的前導字段。沒有參數的split會丟棄前導空格。

$_ = " ab cd"; 
my @a = split    # @a contains ('ab', 'cd'); 
my @b = split /\s+/, $_; # @b contains ('', 'ab', 'cd') 
3

從文檔split

分流/ PATTERN /,EXPR

如果EXPR被忽略,拆分$ _字符串。如果還省略PATTERN,則 會在空白處跳過(在跳過任何前導空格之後)。任何匹配PATTERN的 都被視爲分隔字段的分隔符。 (注意,分隔符可以長於一個字符。)

所以由於兩個圖案和表達被省略,我們正在空格分裂默認變量$_

$dummy變量的用途是捕獲從split返回的列表的第一個元素並忽略它,因爲代碼只對第二個元素感興趣,它將被放入$class

您必須查看周圍的代碼才能找出$_在這方面的含義;它可能是一個循環變量或map塊中的列表項,或其他。

2

如果你讀了documentation,你會發現:

  • 第一個操作數默認爲" "
  • 第二個操作數的缺省值是$_
  • 第三個操作數的缺省值是0

所以

split 

是短期的

split " ", $_, 0 

,這意味着:

以$ _,在空白分裂它的價值,而忽略前後空白。

第一個結果字段被放在$dummy中,第二個被放在$class中。

根據它的名字,我認爲你不要再使用$dummy了,所以它只是作爲一個佔位符。不過,你可以擺脫它。

my ($dummy, $class) = split; 

可以寫成

my (undef, $class) = split; # Use undef as a placeholder 

my $class = (split)[1];  # Use a list slice to get second item