I present again with the hopes of creating an authentic distribution along the lines described in _Intermediate Perl_. bliako and I have been taking turns as each others' sounding board. I have vivisected his original script in Re^4: chunking up texts correctly for online translation. I present invocation, output, then source.

$ ./5.MY.translate.pl --configfile C --from tja --infile /home/bob/Documents/meditations/Algorithm-Markov-Multiorder-Learner-master/data/2.short.shelley.txt --outfile /home/bob/Desktop/1.state

I'll put output in pre tags, because I'm never sure what code tags are gonna do with it:

input  is “The ancient teachers of this science,” said he,
“promised impossibilities and performed nothing. The modern masters
...
unfold to the world the deepest mysteries of creation.


----------------
in new, param_hr is
{
  CONTENT => "\x{201C}The ancient teachers of this science,\x{201D} said he,\n\x{201C}promised 
... the steps\nalready marked, I will pioneer a new way, explore unknown powers, and\nunfold to the world the deepest mysteries of creation.\n\n",
  FROM => "tja",
  key => 123,
  TO => undef,
}
in new, self is 
bless({ format => 5.23, FROM => "en", key => 321, START => 1562613962, TO => "ru" }, "My::Module")
in sub key
akey is  123 
you called key() method on object 'My::Module=HASH(0x5638464c0768)'
key() : changing key to '123'
in sub key
Use of uninitialized value $akey in concatenation (.) or string at ./5.MY.translate.pl line 38.
akey is   
you called key() method on object 'My::Module=HASH(0x5638464c0768)'
my key: 123
--- mod is
bless({ format => 5.23, FROM => "en", key => 123, START => 1562613962, TO => "ru" }, "My::Module")
$ 

Source:

#!/usr/bin/perl -w use 5.011; binmode STDOUT, ":utf8"; use open IN => ':crlf'; use open OUT => ':utf8'; package My::Module; sub new { my ( $class, $param_hr ) = @_; $param_hr = {} unless defined $param_hr; my $self = { # hashref or arrayref key => 321, format => 5.23, START => time(), FROM => 'en', TO => 'ru', }; bless $self, $class; # now your hash is an object of class $clas +s. if ( exists $param_hr->{'key'} ) { say "in new, param_hr is"; use Data::Dump; dd $param_hr; say "in new, self is "; dd $self; } if ( exists $param_hr->{'key'} ) { $self->key( $param_hr->{'key'} ) +} else { warn "param 'key' is required."; return undef } return $self; # return hash, now blessed into a class instance, +hallelujah } # get or set the key sub key { say "in sub key"; my $self = $_[0]; my $akey = $_[1]; # optional key say "akey is $akey "; print "you called key() method on object '$self'\n"; if ( defined $akey ) { print "key() : changing key to '$akey'\n"; $self->{'key'} = $akey; } return $self->{'key'}; } 1; package main; use Getopt::Long; my $outfile = undef; my $configfile = undef; my $infile = undef; my $from = undef; my $to = undef; if ( !Getopt::Long::GetOptions( "outfile=s", \$outfile, "infile=s", \$infile, "configfile=s", \$configfile, "from=s", \$from, "to=s", \$to, "help", sub { print "Usage : $0 --configfile C [--outfile O] [--infile I] [--h +elp]\n"; exit 0; }, ) ) { die "error, commandline"; } die "configfile is needed (via --configfile)" unless defined $configfi +le; my $inFH; if ( defined($infile) ) { open( $inFH, '<:crlf:encoding(UTF-8)', $infile ) or die "opening input file $infile, $!"; } my $instr; { local $/ = undef; $instr = <$inFH> } close $inFH; if ( defined($instr) ) { say "input is $instr"; } say "----------------"; # uncomment only if My::Module is in separate file: #use My::Module; my $mod = My::Module->new( { 'key' => 123, 'CONTENT' => $instr, FROM => $from, TO => $to, } ); die unless defined $mod; print "my key: " . $mod->key() . "\n"; say "--- mod is"; dd $mod; __END__

I thought that I would emulate the syntax in source listing for Translate.pm. (Is this well-written?) With this syntax, I believe that $param_hr is to be understood as an existing reference to a hash of parameters. I believe that this is the main data structure for this object.

sub new { my ( $class, $param_hr ) = @_; my %self = ( key => 0, format => 0, model => 0, prettyprint => 0, default_source => 0, default_target => 0, data_format => 'perl', timeout => 60, force_post => 0, rest_url => $REST_URL, agent => ( sprintf '%s/%s', __PACKAGE__, $VERSION ), cache_file => 0, headers => {}, );

I've been looking at the rest of the code for new here. What does this do?

for my $property ( keys %self ) { if ( exists $param_hr->{$property} ) { my $type = ref $param_hr->{$property} || 'String' +; my $expected_type = ref $self{$property} || 'String' +; croak "$property should be a $expected_type" if $expected_type ne $type; $self{$property} = delete $param_hr->{$property}; } }

It would seem to check whether certain values are strings, but I don't understand the right hand side with

ref something  || something else

How do I get the supplied value from the command line to overwrite the default value from %self ? In this example, I would want to see the value from

--from tja

in the final output for $mod .

Thanks for your comment.


In reply to using Getopt::Long to modify the default values in new by Aldebaran

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.