0

Perl では、サブルーチンのパラメーターのデータ型を指定できますか? たとえば、exit のような数値コンテキストで dualvar を使用する場合:

use constant NOTIFY_DIE_MAIL_SEND_FAILED       => dualvar 3, 'NOTIFY_DIE_MAIL_SEND_FAILED';
exit NOTIFY_DIE_MAIL_SEND_FAILED;

その場合、Perl はどのようにして exit が数値パラメータを期待していることを知るのでしょうか? Java で行うように、サブルーチンのパラメーターのデータ型を定義する方法がわかりませんでした。(明示的に定義されているため、データ型がどのように知られているかを理解できた場所)

4

6 に答える 6

2

Perl では、スカラーは数値であると同時に文字列でもあります。文字列と数値を区別するのは変数自体ではなく、使用する演算子です。加算+では数値のみが使用されますが、連結.では文字列のみが使用されます。

Java などのより強力な型付け言語では、型情報にアクセスできるため、加算演算子は加算および連結演算子としても機能します。

"1" + 2 + 3"1" + 2 + 3 == 6. は Java ではまだ問題がありますが、Perl ではとを明確に区別でき"1" . 2 . 3 eq "123"ます。

0空の文字列を追加または連結することにより、変数の数値または文字列のコンテキストを強制できます。

sub foo {
  my ($var) = @_;
  $var += 0;  # $var is numeric
  $var .= ""; # $var is stringy now
}
于 2012-09-25T11:38:56.990 に答える
2

dualvar の要点は、必要に応じて数値またはテキストとして動作することです。それが明らかでない場合 (perl にとってより重要なことに)、それを明確にしてください。

exit 0 + NOTIFY_DIE_MAIL_SEND_FAILED;

パラメータを明示的に入力することに関しては、それは組み込まれているものではありません。Perl は Java よりもはるかに動的な言語であるため、すべてのパラメータまたは変数の型をチェック/強制することは一般的ではありません。特に、perl サブルーチンは、さまざまな数のパラメーターやさまざまな構造を受け入れることができます。

パラメータを検証したい場合 (たとえば、外部 API の場合)、Params::Validateのようなものを試してください。

さらに、MooseMooでは、特定のレベルの属性の型指定や強制さえも許可されています。

于 2012-09-25T11:43:28.440 に答える
1

その場合、Perl はどのようにして exit が数値パラメータを期待していることを知るのでしょうか?

exitは仕様の一部である数値を期待しており、整数以外の値を渡した場合の動作は未定義のようです (つまり、そうすべきではありません。

さて、この特定のケースでは、 dualvarはどのようにしてコンテキストに応じていずれかの値の型を返すのでしょうか?

Scalar::Util のdualvarがどのように実装されているかはわかりませんが、代わりにオーバーロードで同様のものを書くことができます。

祝福されたオブジェクトの動作を変更することができます:

#!/usr/bin/env perl

use strict;
use warnings;

{package Dualvar;

use overload
    fallback => 1,
    '0+' => sub { $_[0]->{INT_VAL} },
    '""' => sub { $_[0]->{STR_VAL} };

sub new {
  my $class = shift;
  my $self = { INT_VAL => shift, STR_VAL => shift };
  bless($self,$class);
}

1;
}

my $x = Dualvar->new(31,'Therty-One');

print $x . " + One = ",$x + 1,"\n";    # Therty-One + One = 32

ドキュメントから、オーバーロードは実際に宣言スコープ内の動作を変更するように見えるため、任意のオペランドに対してローカルでいくつかの一般的な演算子の動作を変更できるはずです。

exitがこれらのオーバーロード可能な操作のいずれかを使用してそのパラメーターを整数に評価する場合、このソリューションで実行できます。

Java で行うように、サブルーチンのパラメーターのデータ型を定義する方法がわかりませんでした。

すでに他の人が言ったように... これは Perl には当てはまりません。少なくともコンパイル時には、サブルーチンプロトタイプを除いてそうではありませんが、これらはあまり型の粒度を提供しません (int と文字列または異なるオブジェクト クラスのように)。

Richard は、実行時に使用できるいくつかの代替手段について言及しています。パフォーマンスの低下を気にしないのであれば、個人的にMooseをお勧めします。

于 2012-09-27T02:19:56.940 に答える
1

Perlは、変数を..で入力する必要がないため、 -Perlは言語であるという点で Java とはまったく異なります。dynamically typedcompile timeJavastatically typed

contextPerl は、使用される変数に応じて変数の型を決定します。

存在できるのはtwo context: -

  • リスト コンテキスト
  • スカラー コンテキスト

コンテキストは、使用されるoperatororによって定義されます。function

EGの場合:-

# Define a list
@arr = qw/rohit jain/; 

# Define a scalar
$num = 2

# Here perl will evaluate @arr in scalar context and take its length..
# so, below code will evaluate to : - value = 2 / 2
$value = @arr / $num;

# Here since it is used with a foreach loop, @arr will be taken as in list context
foreach (@arr) {
    say $_;
}
# Above foreach loop will output: - `rohit` \n `jain` to the console..
于 2012-09-25T11:35:09.080 に答える