2013-03-07 31 views
3

我想在perl中寫一些設置$的函數!類似於內置的perl函數。當我嘗試這樣做時,它抱怨'參數'無法創建管理員用戶「在標量分配中不是數字」。我已經嘗試使用谷歌搜索這個,但不幸的是谷歌不會看$!所以結果很難得到。

if(!createUser('admin')) { print $!; } 

sub createUser 
{ 
    my ($user) = @_; 
    if($user eq "admin") 
    { 
    $! = "Cannot create admin user"; 
    return 0; 
    } 
    #create user here 
    return 1; 
} 

PS。我知道Try :: Tiny等,但我想保持與腳本的其餘部分的一致性,如果我切換到try/catch,我想移動整個腳本,但我還沒準備好做。

+0

我不認爲你可以這樣做。你爲什麼想要? – squiguy 2013-03-07 23:24:39

+0

如果您想要返回非系統消息,請在模塊名稱空間中使用$ @或全局(例如'$ DBI :: errstr')。 – ikegami 2013-03-08 01:11:43

+0

@squiguy爲了保持一致性,我只想編寫類似於perl函數的代碼。我猜如果perl本身不一致,我就很難編寫一致的代碼:-)看起來有些函數死了,其他函數返回$ !,有些返回$ @,而另外一些則有一個特殊的變量。 – MikeKulls 2013-03-08 06:08:07

回答

12

$!是對應於你的操作系統(errno在Unix-Y libc庫,在Windows別的東西像GetLastError()kernel32.dll)的數值錯誤代碼的魔術變量。

您只能將其設置爲一個數字。當Perl想要在字符串上下文中使用它時,它會將其轉換爲適當的文本錯誤消息。

實施例:

$! = 4; 
print $!, "\n"; 
print 0+$!, "\n"; 

可生產(我的系統中,反正):

Interrupted system call 
4 

這是完全合適的(如果非便攜式的,因爲不同的系統可以自由地使用不同的整數值,以代表標準錯誤代碼)設置$!以對應於您的系統上的一些標準錯誤:

sub my_do_something_with_file { 
    my $file = shift; 
    if (! -f $file) { 
     $! = 2; # "No such file or directory" on my system 
     return; 
    } 
    ... 
} 

但無法創建自己的自定義錯誤消息,以$!返回。

+0

也許一些更多的例子?我認爲,人們想更多地瞭解這種Perl魔術(變量的二元性);) – gaussblurinc 2013-03-08 11:53:28

+1

@loldop:'$ |'是魔術:http://stackoverflow.com/questions/4959230 – mob 2013-03-08 15:56:52

+0

'$%'和'$ ='只能分配整數值。 '$ -'只能分配非負的整數值。 '$?'只能分配-1到65335範圍內的整數值。有用的代碼高爾夫技巧。 – mob 2013-03-08 16:00:28

3

如在perlvar中記載的,$!包含C errno,它是一個數字。文本Perl級錯誤消息出現在[email protected]中,這是通常die設置。我會而不是建議手動設置它,不僅僅是因爲它是一個透明的全局。

只要使用Try::Tiny,如果這是你所需要的。如果腳本的其餘部分寫得不好,那麼與其保持一致就不會獲得太多收益。

+0

我想我會開始使用Try :: Tiny。我遇到的問題是,我假設像'try {print $ fh「abc」;例如,如果文件系統填滿,''不會被捕獲。它沒有我想要的一致性。 – MikeKulls 2013-03-08 06:13:58

+0

你可以'使用autodie;'使內建失敗而不是返回一個標誌 – Eevee 2013-03-08 06:41:02

1

您可以設置$!轉換爲恰好與C errno值相匹配的數值,並設置期望的字符串值。不幸的是,這不是很便攜。

如果$!不是一個神奇的變量,你可以使用dualvar()來分配一個雙數字/字符串值,這是一個核心軟件包Scalar :: Util中可用的。

use Scalar::Util qw(dualvar) ; 
my $x = dualvar(44, "Hello, world"); 
print "string=$x, number=" . (0+$x), "\n"

但是用$!只有這個數字在我之前的嘗試中倖存下來

相關問題