Beefy Boxes and Bandwidth Generously Provided by pair Networks
The stupid question is the question not asked
 
PerlMonks  

Seekers of Perl Wisdom

( [id://479]=superdoc: print w/replies, xml ) Need Help??

If you have a question on how to do something in Perl, or you need a Perl solution to an actual real-life problem, or you're unsure why something you've tried just isn't working... then this section is the place to ask.

However, you might consider asking in the chatterbox first (if you're a registered user). The response time tends to be quicker, and if it turns out that the problem/solutions are too much for the cb to handle, the kind monks will be sure to direct you here.

Post a new question!

User Questions
Archive::Zip: save entire directory?
2 direct replies — Read more / Contribute
by Anonymous Monk
on Dec 05, 2023 at 16:26

    I'm trying to do what I thought would be a very simple task: Create a zipfile with the contents of an entire directory, passed in to a function. I wrote (with very minor changes from the real code):

    sub create_zipfile { my ($path) = @_; my $UUID = Data::GUID->new->as_string(); my $zipfile_name = $UUID . ".zip"; my $full_path = $path . "/" . $zipfile_name; my $zip = Archive::Zip->new(); $zip->addTree($path, undef); if ( ! $zip->writeToFileNamed($full_path) == AZ_OK ) { print "Error writing zipfile: $!\n"; } return $full_path; }
    I tried to run this as "my $filename = create_zipfile("/path/to/directory");", and it fails with IO error: Can't open /path/to/directory/0BE30138-93B4-81EE-93CD-DC592DB8B6F0.zip for write : No such file or directory. Which--I know there's no such file or directory, I'm asking it to be created.

    In a previous version of this--and I don't remember what's different, and can't replicate it--it did create a zipfile, but it was empty.

    I'd be grateful for a pointer; this would seem to be the main way one would use this module, but I can't find discussion of how to do this! Thanks.
SOAP::Lite - how to remove namespaces
1 direct reply — Read more / Contribute
by ffrost
on Dec 05, 2023 at 11:29

    I have code where I've supplied a snippet of the relevant parts below:

    $soap = SOAP::Lite ->proxy($proxy) ->uri($uri) ->autotype(0) ->ns('http://www.w3.org/2003/05/soap-envelope','soap') ->ns('http://mil.dod.af.A1.personnel.dataservices.filter','mil') ->ns('http://mil.dod.af.A1.personnel.dataservices.training/v2.4','v2') ->readable(1);

    This creates the following output:

    <soap:Envelope soap:encodingStyle=http://schemas.xmlsoap.org/soap/encoding/ xmlns:mil=http://mil.dod.af.A1.personnel.dataservices.filter xmlns:soap=http://www.w3.org/2003/05/soap-envelope xmlns:soapenc=http://schemas.xmlsoap.org/soap/encoding/ xmlns:v2=http://mil.dod.af.A1.personnel.dataservices.training/v2.4 xmlns:xsd=http://www.w3.org/2001/XMLSchema xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance>

    But I need it to look like this, without the magically included namespaces:

    <soap:Envelope xmlns:mil=http://mil.dod.af.A1.personnel.dataservices.filter xmlns:v2=http://mil.dod.af.A1.personnel.dataservices.training/v2.4 xmlns:soap=http://www.w3.org/2003/05/soap-envelope>

    How do I get rid of the soap:encodingStyle, xmlns:soapenc, xmlns:xsd and xmlns:xsi namespaces? If I use these extra namespaces in the web service call then it fails their validation check.

Spreadsheet::ParseXLSX returning zero
2 direct replies — Read more / Contribute
by bitingduck
on Dec 05, 2023 at 02:14

    Fellow monks, I have a problem that isn't necessarily a Perl problem, so much as it manifests itself when I'm using Perl, and I'm hoping that there may be a relatively painless Perl solution.

    For many years I've been getting monthly data files in Excel from a little company in Seattle. For years I've parsed them into a database, using first Spreadsheet::ParseExcel, then as the format changed using Spreadsheet::XLSX, and more recently using Spreadsheet::ParseXLSX. And despite the changes from .xls to .xlsx and a few format changes, things have been mostly good.

    Some time around a year ago the format didn't change, but the Spreadsheet::ParseXLSX stopped reading the file correctly. Or maybe more accurately, whoever wrote the file stopped writing it correctly, and now Spreadsheet::ParseXLSX doesn't read it correctly. The particular issue where it first manifests is in reading a cell with "Month Year" in the contents (e.g. "December 2023"). When I read the cell with

     my $mycell=$worksheet->get_cell();

    and then try to evaluate it with either

    my $value=$mycell->value(); # or my $unformatted=$mycell->unformatted();

    it returns "0" or "0.0" respectively. The catch is that if I simply open the file in Excel and hit "save", or open it in Apple's Numbers and export it back to XLSX, it then parses correctly, like it always used to. So the Excel file opener is fairly forgiving of whatever changed, but Spreadsheet::ParseXLSX isn't, and I don't see an obvious way to get at the content to debug. Using Data::Dumper on $mycell also shows zeros where it should give the month and year. I haven't tried other cells - once it barfs, I remember I have to open/save and that presumably fixes all the cells.

    This is something I can live with if I have to, since I only have to deal with the files a few times a year and can just open/save them quickly, but it seems so wrong. I'm not sure it's a widespread problem - someone else is writing the file using a program other than Excel so I can read it with a program other than Excel. The smart thing would be if the generator produced CSV, but that's not something I can influence.

XS Modules - why and when?
9 direct replies — Read more / Contribute
by Bod
on Dec 04, 2023 at 19:22

    I know little about XS modules but I was looking at RPi::DHT11 and noticed that it is an XS module which seemed a little strange. Hence the question here. I was going to email stevieb, the author and ask but thought it would be good to get other people's take on this.

    My understanding of an XS module is that it uses XSLoader to load C / C++ / C# code. The Perl is just a wrapper around the loaded code with the Perl doing little processing. I believe the main reason to do this is for speed as compiled languages of the C family are faster than interpreted languages such as Perl. Is that about right so far?

    Assuming that is something like correct...
    Why would the RPi::DHT11 module use XS? The DHT11 is a temperature and humidity sensor with a maximum frequency of 0.5Hz (one read per 2 seconds). So speed is not the issue here!

    What reason would there be for creating an XS module in this use case? Would it not be easier and simpler and just as fast given the speed of the sensor, to write all the code in Perl?

    I'm hoping for more insights into the world of XS modules here...

How to create and install a module compatible with both UTF8 and Perl 5.8.3 without using non-core modules?
2 direct replies — Read more / Contribute
by Polyglot
on Dec 02, 2023 at 12:04
    My attempt at launching my module belly-flopped. I've learned that even though Test::More is part of Perl core going back to v5.6.2, Test::More::UTF8 was never part of Perl's core. Furthermore, Test2, said to be unicode compatible, only made it to core in Perl 5.25.1.

    My module does not need to use unicode. If the unicode comments and POD were stripped out of it, it would not even require "use utf8;" as there is no unicode in its actual code. But because it is for utf8 and the tests, to be meaningful, incorporate uft8 characters, the entire module fails to install on perl systems which do not already have the non-core module "Test::More::UTF8."

    In order to make the installation as easy and fuss-free as possible, and more space-conserving, too, I don't want to require the installation of non-core modules. If there is not a better way to do this, my next version release will abandon all of those useful tests and put in one or more tests which require no unicode at all--just a "free pass" so to speak. This way, at least, the install would be able to complete.

    So the question remains, is it even possible to create, and install, a module designed for Perl 5.8.3 compatibility, that provides UTF8 functions, and that does not require any non-core modules--and do this with reasonable UTF8-based tests?


    UPDATE:

    I think I've managed to find a hackish solution that should get me by for now. I've dumped once again (I should not have gone back to it after dropping it the first time) the "Test::More::UTF8" package earlier thought to be a "solution" for the lack of UTF8 compatibility of Test::More...it wasn't, and even when the package was manually installed (not part of core), it tended to generate some inexplicable 'wide character' warnings. So, I went with a pure-ASCII solution, no need even for "use utf8" in the testing script. Instead of testing on actual UTF8 characters, the script now tests on the hexadecimal codepoints returned from the module. If the correct codepoint is returned, the function can legitimately be considered to be installed and functioning. It would have been nice to test on real unicode, but oh well...the module will still work just fine, I'm sure.

    Blessings,

    ~Polyglot~

Converting Unicode
4 direct replies — Read more / Contribute
by BernieC
on Dec 01, 2023 at 18:20
    I can't get unicode to work. I have a file that , mixed in with regular text, there are the unicode characters for open quote, close quote and apostrophe. i've been trying to write a little program to replace them with non-unicode characters {" " and ,}. I've tried this test program
    these are the constants from cryptfix # use constant APOSTROPHE => "’" ; # use constant OPENQUOTE => "“" ; # use constant CLOSEQUOTE => "”" ; # use constant COMMA => "¸" ; # This is the version from a hex dump of the crypt text file use constant APOSTROPHE => "\x{e2}\x{80}\x{22}" ; use constant OPENQUOTE => "\x{e2}\x{80}\x{90}" ; use constant CLOSEQUOTE => "\x{e2}\x{80}\x{9d}" ; use constant COMMA => "¸" ; unless (@ARGV) { die "usage: <crypts-text-file>\n" ; } open(CRYPTS, "<", $ARGV[0]) or die "Can't open $ARGV[0]: $!" ; while (my $line = <CRYPTS>) { say "apostrophe in line $." if $line =~ /@{[APOSTROPHE]}/; say "open quote in line $." if $line =~ /@{[OPENQUOTE]}/; say "close quote in line $." if $line =~ /@{[CLOSEQUOTE]}/; }
    and I feed it the text file with the unicode characters in it and it never finds any. I'm not sure what I'm getting wrong.
OpenAPI generator issue
1 direct reply — Read more / Contribute
by Anonymous Monk
on Nov 30, 2023 at 06:44
    I have generated a perl client for a rest api with openapi generator. The slimmed down AuthorizeRequestDTO class is :
    package WWW::OpenAPIClient::Object::AuthorizeRequestDTO; require 5.6.0; use strict; use warnings; use utf8; use JSON qw(decode_json); use Data::Dumper; use Module::Runtime qw(use_module); use Log::Any qw($log); use Date::Parse; use DateTime; use base ("Class::Accessor", "Class::Data::Inheritable"); __PACKAGE__->mk_classdata('attribute_map' => {}); __PACKAGE__->mk_classdata('openapi_types' => {}); __PACKAGE__->mk_classdata('method_documentation' => {}); __PACKAGE__->mk_classdata('class_documentation' => {}); # new plain object sub new { my ($class, %args) = @_; my $self = bless {}, $class; $self->init(%args); return $self; } # initialize the object sub init { my ($self, %args) = @_; foreach my $attribute (keys %{$self->attribute_map}) { my $args_key = $self->attribute_map->{$attribute}; $self->$attribute( $args{ $args_key } ); } } __PACKAGE__->method_documentation({ 'username' => { datatype => 'string', base_name => 'Username', description => '', format => '', read_only => '', }, 'password' => { datatype => 'string', base_name => 'Password', description => '', format => '', read_only => '', }, }); __PACKAGE__->openapi_types( { 'username' => 'string', 'password' => 'string' } ); __PACKAGE__->attribute_map( { 'username' => 'USERNAME', 'password' => 'PASSWORD' } ); __PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); 1;
    I'm trying to create a new object by setting the username and password fields but they always come up undefined !!
    my %h= ('username' => 'TEST_USER','password' => 'dsds'); my $authobj=WWW::OpenAPIClient::Object::AuthorizeRequestDTO->new(%h); print Dumper $authobj; $VAR1 = bless( { 'username' => undef, 'password' => undef }, 'WWW::OpenAPIClient::Object::AuthorizeRequestDTO' );
    The init method does
    $self->$attribute
    what does that mean ? that it calls a $self->update() and a $self->password() methods? But these do not exist in the code!They are only described in __PACKAGE__->method_documentation
    Am I missing something or hasn't the openapi generator generated those two methods?
Strange error when using JSON module "XS.c: loadable library and perl binaries are mismatched"
2 direct replies — Read more / Contribute
by WithABeard
on Nov 30, 2023 at 02:42

    I get this weird error when using the JSON or JSON::XS module:

    $ perl -MJSON -e ''

    XS.c: loadable library and perl binaries are mismatched (got first handshake key 0xeb80080, needed 0xf380080)

    And the same error for perl -MJSON::XS -e ''

    perl -v This is perl 5, version 38, subversion 0 (v5.38.0) built for x86_64-li +nux-thread-multi ...

    What could cause this, and what can I do to fix it?

perl interpreter must be named my_perl?
1 direct reply — Read more / Contribute
by Anonymous Monk
on Nov 30, 2023 at 00:53

    Hi Monks,

    Today I've started to study perlembed, Here is the first code example in Perlembed:

    #include <EXTERN.h> /* from the Perl distribution */ #include <perl.h> /* from the Perl distribution * +/ static PerlInterpreter *my_perl; /*** The Perl interpreter *** +/ int main(int argc, char **argv, char **env) { PERL_SYS_INIT3(&argc,&argv,&env); my_perl = perl_alloc(); perl_construct(my_perl); PL_exit_flags |= PERL_EXIT_DESTRUCT_END; perl_parse(my_perl, NULL, argc, argv, (char **)NULL); perl_run(my_perl); perl_destruct(my_perl); perl_free(my_perl); PERL_SYS_TERM(); exit(EXIT_SUCCESS); }
    Ican build it successfully, and it works as expected.(windows 10, strawberry perl 5.32) But if I change interpreter variable name to his_perl, it doesn't work!
    #include <EXTERN.h> #include <perl.h> static PerlInterpreter *his_perl ; /*** The Perl interpreter * +**/ int main(int argc, char **argv, char **env) { PERL_SYS_INIT3(&argc,&argv,&env); PERL_SYS_TERM(); his_perl = perl_alloc(); perl_construct(his_perl); PL_exit_flags |= PERL_EXIT_DESTRUCT_END; perl_parse(his_perl, NULL, argc, argv, (char **)NULL); perl_run(his_perl); perl_destruct(his_perl); perl_free(his_perl); exit(EXIT_SUCCESS); }
    It can't be build, and complains identifier "my_perl" is undefined. I notice in perl.h aTHX hard code define to my_perl, I guess that is the reason why his_perl version can't be built. But why is this name(my_perl) so important, that it should write it into perl.h? Please enlighten me.
sending raw soap envelope with soap::lite
1 direct reply — Read more / Contribute
by ffrost
on Nov 29, 2023 at 12:26

    Hoping this is an easy problem to solve as my attempts are failing miserably. Using the AI bots and Google only seem to create solutions where the output is all mungled up or the XML elements get repeated, or worse new XML elements are added.

    In short, I'm creating a specific soap envelope I need to send to the endpoint web service. The reason is due to complexity and the inability for SOAP::Lite to render the output correctly. This also provides more control for changes as they occur. But when I try to make the call to the web service and send the envelope it seems to be sending the data modified, or the method call is not correct, etc.

    I'll post an example below and hopefully someone has a 'duh' answer I seem to be missing.

    use SOAP::Lite; use SOAP::Lite on_action => sub {sprintf '%s/%s',@_}; $proxy = 'https://proxy.com/2.3'; $uri = 'https://uri.dataservices.training'; $method = 'methodCall'; $soap = SOAP::Lite ->proxy($proxy) ->uri($uri); $soapenv = <<'EOF'; <?xml version="1.0" encoding="UTF-8"?> <soap:Envelope ... (bunch of NS values)> <soap:Header> (bunch of header settings here) </soap:Header> <soap:Body> (bunch of body settings here) </soap:Body> </soap:Envelope> EOF $results = $soap->call("$uri/$method",$soapenv);

    This is resulting in the error "Element ..($uri/$method) ... can't be allowed in valid XML message.


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


  • Are you posting in the right place? Check out Where do I post X? to know for sure.
  • Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
    <code> <a> <b> <big> <blockquote> <br /> <dd> <dl> <dt> <em> <font> <h1> <h2> <h3> <h4> <h5> <h6> <hr /> <i> <li> <nbsp> <ol> <p> <small> <strike> <strong> <sub> <sup> <table> <td> <th> <tr> <tt> <u> <ul>
  • Snippets of code should be wrapped in <code> tags not <pre> tags. In fact, <pre> tags should generally be avoided. If they must be used, extreme care should be taken to ensure that their contents do not have long lines (<70 chars), in order to prevent horizontal scrolling (and possible janitor intervention).
  • Want more info? How to link or How to display code and escape characters are good places to start.
Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others perusing the Monastery: (6)
As of 2024-04-25 10:36 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found