1

main.pl :

#!/usr/bin/perl
use strict;
use warnings;
use v5.14;
use ReadData;

my $read = ReadData->new();
my @name = $read->getNames();
$read->printNames(@name);

ReadData.pm :

#!/usr/bin/perl
package ReadData;
use strict;
use warnings;
use v5.14;

#

sub new {
    my $class = shift;
    my $self = {};
    bless $self, $class;
    return($self);
}

sub getNames {
    # read in data
    my @data;
    print "\nName of first matrix? ";
    chomp($data[0] = <>);
    print "\nName of second matrix? ";
    chomp($data[1] = <>);
    return(@data);
}

sub printNames {
    my @name = @_;
    print "\nname1: " . $name[0];
    print "\nname2: " . $name[1];
}

1;

メイン プログラムの別のバージョンにこれらのサブルーチンがあり、そこではすべて正常に動作します。私はオブジェクトを呼び出さず、下に見られるように入力名は出力に正しく反映されます:

my @name = getNames();
printNames(@name);

sub getNames { same as above . . . }
sub printNames{ same as above . . . }

一番上に貼り付けたコードは、実行されて出力が得られるため、技術的には機能しますが、出力は正しくありません。

ファースト ネームに「A」、セカンド ネームに「B」と入力すると、次のように返されます。

>>> perl alt.pl

Name of first matrix? A

Name of second matrix? B

name1: ReadData=HASH(0x1d082f0)
name2: A

誰でもこれを修正するのを手伝ってもらえますか? 私はオンラインで 50 ほどの perl チュートリアルを読んでいますが、自分がやるべきことについて頭を整理することができません。私の他の唯一の実際のプログラミング経験は Java での OOP であり、この perl コンストラクターには従いません。. .

4

2 に答える 2

2

あなたが見逃している主なことは、オブジェクトのメソッドを呼び出すときだと思います:

$read->printNames(@name);

オブジェクト自体 ( ) は、すべての通常の引数の前に、最初の引数として$readメソッド ( ) に渡されます。printNames(Java では、これは暗黙のうちに発生します — オブジェクトは魔法のように as として利用可能になりますthis— しかし、Perl では明示的です — オブジェクトは$_[0]です。) したがって、次のように変更できますprintNames

sub printNames {
    my $this = shift;
    my @name = @_;
    print "\nname1: " . $name[0];
    print "\nname2: " . $name[1];
}

(もちろん、Perl では、Java と同様に、インスタンス メソッドがオブジェクトと何らかの関係を持つことがより一般的です。あなたのprintNamesメソッドは、まったく使用しないという点で奇妙$thisです。しかし、これで始められるはずです。)

于 2013-03-22T02:22:02.680 に答える
0

おそらく、データを前後にコピーするのではなく、オブジェクト内にデータを保存する必要があります。

alt.pl:

#!/usr/bin/perl
use strict;
use warnings;
use ReadData;

my $read = ReadData->new();
$read->getNames();
$read->printNames();

ReadData.pm:

package ReadData;
use strict;
use warnings;

#

sub new {
    my $class = shift;
    my $self = {};
    bless $self, $class;
    return($self);
}

sub getNames {
    my $self = shift;
    # read in data
    print "\nName of first matrix? ";
    chomp($self->{name1} = <>);
    print "\nName of second matrix? ";
    chomp($self->{name2} = <>);
    return;
}

sub printNames {
    my $self = shift;
    print "\nname1: " . $self->{name1};
    print "\nname2: " . $self->{name2};
}

1;
于 2013-03-22T04:40:45.400 に答える