1

スクリプトを継承し、ハッシュから一部のデータにアクセスできるようにする必要があります。以下から MB_Path 値にアクセスできるようにしたいです。

$VAR1 = bless(
    {  
        'ME_Parts' => [
            bless(
                {  
                    'ME_Bodyhandle' => bless(
                        {  
                            'MB_Path' => '/tmp/msg-15072-1.txt'
                        },
                        'MIME::Body::File'
                    ),
                    'ME_Parts'       => [],
                    'mail_inet_head' => bless(
                        {  
                            'mail_hdr_foldlen' => 79,
                            'mail_hdr_modify'  => 0,
                            'mail_hdr_list'    => [
                                'Content-Type: text/plain; charset="us-ascii"',
                                'Content-Transfer-Encoding: quoted-printable'
                            ],
                            'mail_hdr_hash' => {
                                'Content-Type' => [
                                    \$VAR1->{'ME_Parts'}[0]{'mail_inet_head'}
                                      {'mail_hdr_list'}[0]
                                ],
                                'Content-Transfer-Encoding' => [
                                    \$VAR1->{'ME_Parts'}[0]{'mail_inet_head'}
                                      {'mail_hdr_list'}[1]
                                ]
                            },
                            'mail_hdr_mail_from' => 'KEEP',
                            'mail_hdr_lengths'   => {}
                        },
                        'MIME::Head'
                    )
                },
                'MIME::Entity'
            ),
            bless(
                {  
                    'ME_Bodyhandle' => bless(
                        {   
                            'MB_Path' => '/tmp/msg-15072-2.html'
                        },  
                        'MIME::Body::File'
                    ),  
                    'ME_Parts'       => [], 
                    'mail_inet_head' => bless(
                        {   
                            'mail_hdr_foldlen' => 79, 
                            'mail_hdr_modify'  => 0,
                            'mail_hdr_list'    => [
                                'Content-Type: text/html;charset="us-ascii"',
                                'Content-Transfer-Encoding: quoted-printable'
                            ],
                            'mail_hdr_hash' => {
                                'Content-Type' => [
                                    \$VAR1->{'ME_Parts'}[1]{'mail_inet_head'}
                                      {'mail_hdr_list'}[0]
                                ],
                                'Content-Transfer-Encoding' => [
                                    \$VAR1->{'ME_Parts'}[1]{'mail_inet_head'}
                                      {'mail_hdr_list'}[1]
                                ]
                            },
                            'mail_hdr_mail_from' => 'KEEP',
                            'mail_hdr_lengths'   => {}
                        },
                        'MIME::Head'
                    )
                },
                'MIME::Entity'
            )
        ],
        'ME_Epilogue'    => [],
        'ME_Preamble'    => [],
        'mail_inet_head' => bless(
            {
                'mail_hdr_foldlen' => 79,
                'mail_hdr_modify'  => 0,
                'mail_hdr_list'    => [
'Content-Type: multipart/alternative;boundary="----_=_NextPart_002_01CEB949.DC6B0180"'
                ],
                'mail_hdr_hash' => {
                    'Content-Type' =>
                      [ \$VAR1->{'mail_inet_head'}{'mail_hdr_list'}[0] ]
                },
                'mail_hdr_mail_from' => 'KEEP',
                'mail_hdr_lengths'   => {}
            },
            'MIME::Head'
        )
    'MIME::Entity'
);

私は単に次のことができると思った

print $ent->parts->($i)->{ME_Bodyhandle}->{MB_Path};

ただし、それを行うと、値が初期化されていないというエラーが発生します。しかし、ダンプを実行すると$ent->parts->($i)、上記のコードが得られます。

私はこれにこだわっています。ありがとう、レオC

4

3 に答える 3

4

ドキュメントの可能性を使い果たすまでは、Perl オブジェクトを表す基礎となるデータ構造をダンプし、そのコンポーネントへのアクセスをハードコーディングする言い訳はできません。カプセル化の規則は、他の言語と同様に、Perl オブジェクト指向プログラミングにも適用されます。

MIME::Entity と のドキュメント MIME::Body は非常に明確で、必要なコードは次のようなものです

for my $part ($ent->parts) {
  my $path = $part->bodyhandle->path;
  print $path, "\n";
}

出力

/tmp/msg-15072-1.txt
/tmp/msg-15072-2.html
于 2013-09-30T19:04:44.227 に答える
0

これ:

print $ent->parts->($i)->{ME_Parts}->[$i]->{ME_Bodyhandle}->{MB_Path};
于 2013-09-30T18:13:42.323 に答える