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.stateI'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 elseHow 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 tjain the final output for $mod .
Thanks for your comment.
In reply to using Getopt::Long to modify the default values in new by Aldebaran
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |