2

ダイヤモンド演算子から関数 (サブ) に値を直接渡すにはどうすればよいですか?

私が試してみました:

#!/usr/bin/perl
use Math::Complex;

#quadraticEq - quadratic equation with parameters a ,b ,c
sub quadraticEq {
    print "\nx1= ", 
      ($_[1]*$_[1]-sqrt($_[1]*$_[1]-4*$_[0]*$_[2]))/(2*$_[0]),
      "\nx2= ",
      ($_[1]*$_[1]+sqrt($_[1]*$_[1]-4*$_[0]*$_[2]))/(2*$_[0]);
}

print 'Enter Numbers:';
quadraticEq(<>,<>,<>); #here

しかし、関数の各引数に数字を入力するときに EOF を入力する必要があります。として動作し@array=<>ます。のように動作させたい$var=<>。したがって、入力は次のようになります。

Enter Numbers: 5 4 3
4

4 に答える 4

6

私があなたの質問を手伝っている間、私はあなたにいくつかのベストプラクティスを示すつもりです...

#!/usr/bin/perl

use strict;     # strict/warnings helps detect lots of bugs and logic issues,
use warnings;   # so always use them

use Math::Complex; # WHITESPACE IS YOUR FRIEND

#quadraticEq - quadratic equation with parameters a ,b ,c

sub quadraticEq{
    # Shift out your subroutine variables one at a time, or assign them to a list.
    my ($a, $b, $c) = @_;

    print "\nx1= ", 
      ($b*$b-sqrt($b*$b-4*$a*$c))/(2*$a), # You're wrong on your formula btw
      "\nx2= ",
      ($b*$b+sqrt($b*$b-4*$a*$c))/(2*$a);
}

print 'Enter Numbers: ';

# Perl only supports reading in a line at a time, so... if you want all your
# inputs on one line, read one line.
# EDIT: That's not strictly true, since you can change the input record separator,
# but it's just simpler this way, trust me.

my $line = <>;

# Then you can split the line on whitespace using split.
my @coefficients = split /\s+/, $line;

# You should check that you have at least three coefficients and that they
# are all defined!

quadraticEq(@coefficients);
于 2011-03-17T16:26:46.460 に答える
5

<>関数引数のリスト内の裸の演算子は、常にリスト コンテキストで呼び出されます。ただし、必要なスカラー コンテキストを強制する方法は多数あります。

quadraticEq(scalar <>, scalar <>, scalar <>);
quadraticEq("" . <>, "" . <>, "" . <>);
quadraticEq(0 + <>, 0 + <>, 0 + <>);  # if you want to evaluate as numbers anyway

<>スカラーコンテキストでは、入力から次の「レコード区切り」までが読み取られることに注意してください。これはデフォルトでシステムの改行であるため、上記のコードのデフォルトの動作は、各行から個別の値を読み取ることです。(元の投稿が示唆するように) 入力がスペースで区切られ、すべてが 1 行にある場合は、次のいずれかを行う必要があります。

  1. $/ = " "を呼び出す前に、レコード セパレータをスペース ( ) に設定する<>か、または
  2. split入力行を個別の値に解析するなど、別のスキームを使用する
# 入力の行を読み取り、空白で区切られた 3 つの値を抽出します
quadraticEq( 分割 /\s+/, <>, 3 );

このような問題については、ほとんどの場合 #2 を使用しますが、それを行う方法は複数あります。

于 2011-03-17T16:20:56.717 に答える
2

一般に、サブルーチンに値を渡すとき、Perlはリストコンテキストを使用するため、実行しているのは<>を使用するのと同じ方法です。

my @args = (<>, <>, <>);

明らかに、これはあなたが望むものではありません!

scalar次のキーワードを使用して、スカラーコンテキストを強制できます。

my @args = ( scalar <>, scalar <>, scalar <>); # read one

または、それらをすべて変数に読み込んで、人々があなたの意図を理解できるようにします。

my $first = <>;
my $second = <>;
my $third = <>;

余談ですが、引数を使用する前に、@_から引数を実際に解析する必要があります。それはあなたの機能を非常に理解しやすくします。例:

sub quadratic2 {
    my ($a, $b, $c) = @_;
    ... # now use the actual symbols instead of array indexes
}
于 2011-03-17T16:24:18.303 に答える
2
quadraticEq(map scalar <>, 1..3);

perldoc-freadlineも参照してください。

于 2011-03-17T16:27:36.897 に答える