5

私はPerlを初めて使用します。誰か次のスクリプトを説明してください。

#!/usr/bin/env perl
use strict;
use warnings;
sub f1($) { my ($v) = @_; print "f1 $v\n"; }
sub f2(@) { my ($v) = @_; print "f2 $v\n"; }
my $s = "ww";
my @a = ("xx", "yy", "zz");
f1 $s; f1 @a; f2 $s; f2 @a;

私のコンピューターの出力は次のとおりです。

f1 ww
f1 3
f2 ww
f2 xx     # why!!

4 番目の出力が xx である理由を説明できる人はいますか? 配列がスカラーに変換されるとき、それは配列の最後の要素でなければならないので、それはzzであるべきだと思いました。

4

3 に答える 3

4

いいえ、次のようなステートメントを使用します。

my ($v, $foo, $bar) = @_;

$v@_配列の最初の値、2 番目の値、というように割り当てられます$foo。これは、括弧がリスト コンテキストを強制するためです。変数の 1 つが配列でない限り、余分な値は無視されます。配列の場合、残りのすべての値が丸呑みされます。

my ($v, @foo, $bar) = @_;   # wrong! $bar will never get any value

$v最初の値を取得し@foo、残りはすべて取得します。$bar未定義になります。

リストを使った代入を考えているかもしれません:

my $v = qw(a b c);

しかし、これは間違っており、エラーが発生します:

Useless use of a constant (a) in void context at -e line 1.
Useless use of a constant (b) in void context at -e line 1.

これは、LHS がスカラー コンテキストを使用しているためです。(多かれ少なかれ) 次のようになります。

'a';
'b';
my $v = 'c';

$v括弧の中に入れてリスト コンテキストを強制すると、異なる結果が得られることに気付くかもしれません。

my ($v) = qw(a b c);  # $v is now 'a'

ETA: プロトタイプについて:

ではf1、サブルーチンがスカラー引数を想定しているため、配列が強制的にスカラー コンテキストになっていることがわかります。そのためf1、配列の出力3(サイズ) を使用します。プロトタイプが配列を探すとき、配列はデフォルトのリスト コンテキストのままであり、割り当ては通常どおりに行われます (上記のとおり)。

追加の注意として、プロトタイプには非常に特殊な用途があり、引数の処理に関してサブルーチンを特定の組み込み関数のように動作させることができます。sort { code here }またはなどpush @array, $foo

これがあなたの求めているものでない場合は、プロトタイプをすべてスキップして、次のように単純に記述してください。

sub f1 {
...
}

ドキュメントはこちら

于 2012-06-22T06:33:10.320 に答える
1

Perl 配列は、コンテキストに関して 2 つの異なるフレーバーで動作します:
スカラー コンテキスト:

my $a = @tab; # get the array length
配列コンテキスト:
my @newTab = @tab; # newTab is a copy of tab
これは次のように言い換えることができます。
# 3 scalars in an array context (see parens) gets the contents of the tab
my ($a,$b,$c) = @tab; 
ここで、@tab はスカラーの数よりも広くなる可能性があるため、これらのスカラーはタブの先頭から (末尾からではなく) 取り込まれます。だからあなたのコード:
my ($a) = @tab;
タブの最初の要素をエコーし​​ます

于 2012-06-22T06:43:37.727 に答える
0
  • 配列はスカラーに変換できません。ただし、配列はスカラー コンテキストで評価できます。

  • スカラー コンテキストで評価された配列は、配列の最後の要素を返しません。で見たようf1に、配列内の要素の数を返します。

    $ perl -E'my @a = qw( xx yy zz ); say @a; say scalar(@a);'
    xxyyzz
    3
    
  • どちらの配列もスカラー コンテキストで評価されていません。引数リスト式は、リスト コンテキストで評価されます。

    f(@a);
    

    と同じです

    f($a[0], $a[1], $a[2]);
    

    リスト コンテキストで評価されるリスト代入の RHS 。

    my ($v) = @_;
    

    と同じです

    my ($v) = ($_[0], $_[1], $_[2]);
    

    これはと同じです

    my ($v, undef, undef) = ($_[0], $_[1], $_[2]);
    
于 2012-06-22T07:35:53.847 に答える