2011-06-15 74 views
6

我有一個接受用戶輸入的函數。輸入可能是一個整數,一個浮點數或一個字符串。我有三個重載函數,應該根據輸入數據的數據類型來調用。例如,如果用戶輸入一個整數(比如100),則應該調用具有整數參數的函數。如果用戶輸入一個字符串(比如說「100」),那麼應該調用具有字符串參數的函數。在Perl中查找標量變量的數據類型

所以我需要找出輸入數據的數據類型。使用正則表達式,我可以區分整數和浮點數(因爲我只需要找出類型,我不喜歡使用cpan.org提供的庫),但我無法弄清楚如何區分字符串中的整數。 Perl將「100」和100視爲相同?有什麼辦法可以解決這個問題嗎?

+5

治療'「100」'和'100'相同通常被認爲的Perl的特徵。你需要更好地解釋爲什麼它是一個問題。用戶調用'your_function(100)'時應該發生什麼,以及它與用戶調用'your_function(「100」)'時有什麼不同? – mob 2011-06-15 17:38:20

+1

Ohk ..我想到了沒有進入這個細節。但是由於情況需要:我必須從perl中調用一些C函數。這些函數被重載並存在於我的庫中。所以我需要找出類型並調用EXPLICITLY函數的正確版本。 – letsc 2011-06-15 17:43:52

+1

不理我的[刪除]答案。我誤解了這個問題的意圖,並沒有意識到你所說的「輸入」是功能的物理論證。 – dolphy 2011-06-15 17:49:10

回答

11

perldoc perldata

標量不一定是一件事或其他。沒有必要將標量變量聲明爲「string」類型,輸入「number」,輸入「reference」或其他任何東西。由於標量的自動轉換,返回標量的操作無需關心(實際上也不在意)調用者是在查找字符串,數字還是引用。 Perl是一種上下文多態語言,其標量可以是字符串,數字或引用(包括對象)。雖然字符串和數字在幾乎所有用途上都被認爲是幾乎相同的東西,但是引用是強類型的,具有內置引用計數和析構函數調用的不可轉換指針。

因此,對於整型標量,您只需提前決定如何處理它們。取決於上下文,Perl會高興地將數字轉換爲字符串,反之亦然。

+0

嗯,謝謝..所以我不應該浪費我的時間在這個,並理清其他處理方法..:D – letsc 2011-06-15 17:47:22

2
#!perl6 

use v6; 

multi guess (Int $a) { say "got integer: $a" } 
multi guess (Str $a) { say "got string: $a" } 
multi guess (Rat $a) { say "got float: $a" } 

guess(3); 
guess("3"); 
guess(3.0); 

作弊,我知道......

保羅

+0

聽起來不錯!一定會試一試。任何機會,任何這樣的選擇或任何其他選擇與版本5? – letsc 2011-06-15 18:09:37

+0

我不是。我不認爲我們很快會看到在Perl5中輸入很強的... – pavel 2011-06-15 21:12:48

9

Perl不會讓數字與數字的字符串表示之間的有效區分。你的腳本也不應該。您可以編寫一些代碼來區分看起來像整數和浮點數的東西,但要知道它是否是字符串,唯一的方法是標量看起來不像整數或浮點數。

這是一個簡單的例程,它將返回int,ratstr作爲它的參數。請注意,100'100'都是int,但類似'asdf'將是str

use Scalar::Util 'looks_like_number'; 
sub guess_type { 
    looks_like_number($_[0]) ? $_[0] =~ /\D/ ? 'rat' : 'int' : 'str' 
} 

say guess_type 1;  # int 
say guess_type "1"; # int 
say guess_type 1.1; # rat 
say guess_type 'asdf'; # str 

既然你是在映射Perl的變量工作給C函數,你可以寫這樣的事情:

sub myfunction { 
    if (looks_like_number($_[0]) { 
     if ($_[0] =~ /\D/) {C_float($_[0])} 
     else    { C_int($_[0])} 
    } 
    else {C_string($_[0])} 
} 

哪些應該「做正確的事」給出了一個Perl標量的時候。您可能還想添加一個檢查來查看參數是否爲引用,然後以不同的方式處理該案例。

+0

我完全不同意這個觀點:「你的腳本也不應該。」僅僅因爲語言沒有做某件事並不意味着做這件事總是錯的。 – Anthony 2013-12-12 00:38:46

1

您是否考慮過使用指示輸入是什麼數據類型的鍵來傳遞函數的哈希引用?

my $str_input = { string => "100" }; 
my $int_input = { integer => 100 }; 
my $float_input = { float => 100.0 }; 

您可以檢查什麼類型,你通過檢查輸入具有關鍵了: my $datatype = shift (keys %{$input}),並從那裏。 (注意隱式解除引用發生在$input

switch ($datatype) { 
    case string: 
     C_string($input->{$datatype}); 
    case integer: 
     C_integer($input->{$datatype}); 
    case float: 
     C_float($input->{$datatype}); 
}