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に切り替えると、準備ができていないスクリプト全体を移動したいと思います。

4

3 に答える 3

12

$!は、オペレーティング システムの数値エラー コードに対応する魔法の変数です ( errnoUnix-ylibcライブラリでGetLastError()kernel32.dll、Windows のようなものです)。

数値のみ設定できます。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;
    }
    ...
}

ただし、 で返される独自のカスタム エラー メッセージを作成する機能はありません$!

于 2013-03-07T23:24:30.587 に答える
3

perlvarに記載されているように、数値で$!ある C が含まれていerrnoます。テキスト形式の Perl レベルのエラー メッセージが に表示されます。通常$@、これはによって設定されます。手動で設定することお勧めしません。特に、これはグローバルなトランスパッケージであるためです。die

Try::Tinyそれが必要な場合にのみ使用してください。スクリプトの残りの部分が適切に記述されていない場合、スクリプトとの一貫性を維持してもあまりメリットがありません。

于 2013-03-07T23:22:34.897 に答える
1

$!を設定できます。たまたま C errno 値に一致し、予期される文字列値を設定する数値に変換します。残念ながら、これはあまり移植性がありません。

もし$!は、コア パッケージである Scalar::Util で利用可能な dualvar() を使用してデュアル数値/文字列値を割り当てることができる魔法の変数ではありませんでした。

Scalar::Util qw(dualvar) を使用します。
my $x = dualvar( 44, "こんにちは、世界" );
print "string=$x, number=" . (0+$x), "\n"

しかし、$で!私の以前の試みで生き残ったのはその数だけでした。

于 2013-03-07T23:40:15.640 に答える