On 4/1/25 4:04 PM, Bruce Gray wrote:


On Apr 1, 2025, at 03:55, ToddAndMargo via perl6-users <perl6-us...@perl.org> 
wrote:

--snip--

I have the following run string:
raku C:\NtUtil\RLA.Backup.raku --rotates 345 --UNC_BackupPath 
\\192.168.240.10\Backup\MyDocsBackup\backup1 --debug


use Getopt::Long;  # get-options
get-options('debug' => $CommandLine.debug );

error out with
    No such method 'debug' for invocant of type 'List'

What am I doing wrong?

You are not giving us a 
https://en.wikipedia.org/wiki/Minimal_reproducible_example , so I am having to 
guess.
My guess is that you have defined `$CommandLine` in a way that lacks a 
writeable `.debug` method.

You *could* simplify the call to `get-options` to use a simple temp variables 
(similar to the documentation), then copy the temp into some `debug` and 
similar parts  of your more complex `$CommandLine` data structure, but I expect 
your full code is trying to avoid such temp vars.

Here is a complete runnable program to demonstrate skipping any temp vars, 
using a wild guess that `$CommandLine` is the sole instance of a OO data class:

     class CommandLineInfo {
         has Bool $.debug is rw = False;
     }

     my CommandLineInfo $CommandLine .= new;

     use Getopt::Long;
     get-options( 'debug' => $CommandLine.debug );

     say $CommandLine.debug; # Will be `True` or `False`, depending on 
command-line arg.

If this code does not align with (and is not adaptable to) your use case, we 
(or at least *I*) will need more information from you, especially the 
definition of `$CommandLine` in your current code.
As always, minimal *runnable* code will allow any of us to provide an answer to 
you more quickly.

FWIW, I use `sub MAIN`, but if I were to use `Getopt::Long`, I might use the 
(under-documented) method of having `get-options` build the data structure 
itself:
        use Getopt::Long;
        my %CommandLine = get-options( 'debug', 'rotates=i', 'UNC_BackupPath=p' 
).hash;
        say ?%CommandLine<debug>;   # Just the `debug` argument, forced to Bool
        say %CommandLine.raku;      # All the specified arguments.


Many thanks,
-T

You are very welcome!


Hi Bruce,

Sorry.  I do know I am suppose to post some minimal code.
I was programming for 11 straight hours and was not
thinking too clearly.

I was trying to do what you said.  Read it into a hash, then
extract the values into an OOP structure.    (I use to like
hashes, but dropped them hard when I figured out OOP
structures.  I absolutely  A-D-O-R-E  OOP structures.)

Thank you again for the help!
-T


Windows Server 2025 (souped up W11)

raku -v
Welcome to RakudoΓäó v2025.02.
Implementing the Raku® Programming Language v6.d.
Built on MoarVM version 2025.02.

https://raku.land/cpan:LEONT/Getopt::Long


<getopstest.raku>
#!/usr/bin/env raku

use lib 'C:/NtUtil', 'C:/NtUtil/p6lib'; # use this one on customer machines
use Getopt::Long;  # get-options


class CommandLineClass {
    has Bool $.help           is rw;
    has Bool $.debug          is rw;
    has Str  $.UNC_BackupPath is rw;
    has Int  $.rotates        is rw;
    has      $.ParentDir      is rw;
}

my $CommandLine = CommandLineClass.new{
    help           => False,
    debug          => False,
    UNC_BackupPath => Q[\\192.168.240.10\MyDocsBackup\backup1],
    rotates        => 2,
    ParentDir      => "/"
};


# raku getopstest.raku --rotates 456 --UNC_BackupPath \\192.168.240.235\MyDocsBackup\\backup1 --help --debug

my %opts;
# %opts = ( 'help' => False, 'debug' => False, 'UNC_BackupPath=s' => "", 'rotates=i' => 0 );


# %opts = get-options( %opts ).hash;
%opts = get-options( 'help', 'debug', 'UNC_BackupPath=s', 'rotates=i' ).hash;
say "\%opts =\n" ~ %opts ~ "\n";

$CommandLine.UNC_BackupPath = %opts<UNC_BackupPath>.Str;
$CommandLine.help           = %opts<help>;
$CommandLine.debug          = %opts<debug>;
$CommandLine.rotates        = %opts<rotates>.Int;

if $CommandLine.debug  {
   print $CommandLine.help ~ "\n";
   print $CommandLine.debug ~ "\n";
   print $CommandLine.UNC_BackupPath ~ "\n";
   print $CommandLine.rotates ~ "\n";
}
</getopstest.raku>


C:\NtUtil>raku getopstest.raku --rotates 456 --UNC_BackupPath \\192.168.240.235\MyDocsBackup\\backup1 --help --debug

%opts =
UNC_BackupPath  \\192.168.240.235\MyDocsBackup\\backup1
debug   True
help    True
rotates 456

No such method 'UNC_BackupPath' for invocant of type 'List'
  in method throw at 'SETTING::'src/core.c/Exception.rakumod line 65
  in block <unit> at getopstest.raku line 34

Line 34 is
   $CommandLine.UNC_BackupPath = %opts<UNC_BackupPath>.Str;

Line 34-37 all give the same error if I comment out the ones
above them

Reply via email to