2

配列から奇数を取得するには、このコードを取得しましたが、1 つの構文を理解していませんでした。コードは以下の通り

#!/usr/bin/perl

use strict;
use warnings;

# initialize an array
my @array = qw(3 4 5 6 7 8 9);

my @subArray = ();
  foreach (@array) {
  push @subArray, $_ if $_ & 1;
}
print "@subArray\n";
# displays: 3 5 7 9

「if $_ & 1」とはこれは機能しています。しかし、「if $_ & 1」という構文が得られませんでした。

同様に、grep は "my @subArray = grep $_ & 1, @array; " のように使用できます。

構文を理解するのを手伝ってください

4

5 に答える 5

4

とは $_ & 1?

この式は、下位ビットを分離し、下位ビットが設定された数値 (奇数) のみを分離します。

  • $_はデフォルトの変数で、この場合は各配列要素です
  • &バイナリ AND 演算子/ビットごとの文字列演算子です (オペランドをビットごとに一緒に返します)
  • 11つだけです

  • 詳細についてはperldoc perlop、(乗法演算子) およびビットハックを参照してください。

または、モジュロ演算子を使用して偶数/奇数を解析できます%

forループを使用します。

my @odd;
for (@array) {
   push @odd, $_ if $_ % 2;
}

使用するmap

my @odd = map { $_ % 2 ? $_ : () } @array;

またはarray slice使用してgrep..

my @odd = @array[grep { ! ($_ % 2) } 0 .. $#array];
于 2013-08-11T18:10:48.520 に答える
4

その行の構造は次のとおりです。

<statement> if <condition>

どこ<statement>とです. push @subArray, $__<condition>$_ & 1

$_ & 1は、 の最下位ビット$_が設定されているかどうかによって 1 または 0 になります。1 ( truePerl の値)の場合、push @subArray, $_実行されます。それ以外の場合は 0 ( falsePerl の値) で、ステートメントはスキップされます。

于 2013-08-11T17:48:47.620 に答える
3

の意味は$_ & 1上記で説明しましたが、この場合は次のように書くと保守しやすいと思います。

my @oddArray = grep { $_ % 2 != 0 } @array;

于 2013-08-12T02:42:32.413 に答える
2

論理:
奇数と 1 (もちろん 2 進数) の間で AND 演算を行うと、得られる結果は常に 1 になります。

仕組み:
上記のコードは、配列要素と数値 1 の間でビットごとの AND 演算を実行することにより、奇数を探します。演算の結果が「true」の場合、最終的な配列 (@subArray) に挿入されます。ここでの $_ は、反復中にアクセスされる元の配列の個々の要素を参照しています。

ビットごとの AND 演算がどのように機能するかを次に示します。

  1. 3 が奇数かどうかを判断したいとします (3 の 2 進数 -> 0011)。
  2. このコードによると、バイナリが 0001 である 1 でビットごとの AND を実行しています。
  3. AND 演算は 0011 と 0001 の間で行われ、ビット単位であるためビットは他のビットの対応するビットと AND 演算されます。
  4. 3のバイナリ
    : 0 0 1 1 1
    のバイナリ: 0 0 0 1
    AND の結果: 0 0 0 1
  5. ご覧のとおり、最終結果は 1 です。これは最下位ビットでもあります (右から始まる最初のビット)。したがって、式の結果は「true」になり、演算if $_ & 1;によって数値が , に挿入されます。subArraypush
于 2013-08-12T13:54:16.640 に答える
1

なぜ単純ではないのですか?

my @subArray = grep {$_ & 1} @array;

qw(3 4 5 6 7 8 9)また、数値が必要なときに配列を初期化するのはなぜですか?

my @array = (3, 4, 5, 6, 7, 8, 9);

はるかに優れています。CPU 時間とメモリを浪費しているだけでなく、さらに重要なことに、コードの読者を誤解させています。これは、より明白なコードを指摘しています。

my @subArray = grep {$_ % 2} @array;

パフォーマンスの違いはごくわずかであり、何が起こっているかははるかに明白です。

于 2013-08-12T05:44:08.560 に答える