Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

Re: How to have OS specific code sections in Perl

by toolic (Bishop)
on Oct 31, 2012 at 17:14 UTC ( [id://1001713]=note: print w/replies, xml ) Need Help??


in reply to How to have OS specific code sections in Perl

if (untested):
use warnings; use strict; my $LINUX = 0; if ($^O eq 'linux') { $LINUX=1; }; use if $LINUX, 'MIDI::ALSA' => ('SND_SEQ_EVENT_PORT_UNSUBSCRIBED', 'SND_SEQ_EVENT_SYSEX'); if ($LINUX) { print STDERR "OS is Linux\n"; MIDI::ALSA::client('test',1,1,1); MIDI::ALSA::connectfrom(0,'MidiSport 4x4:0'); MIDI::ALSA::connectto(1,'MidiSport 4x4:0'); MIDI::ALSA::start(); }

UPDATE: deleted 2nd 'use'

Replies are listed 'Best First'.
Re^2: How to have OS specific code sections in Perl
by aitap (Curate) on Oct 31, 2012 at 18:54 UTC
    Unfortunately, this is not going to work because $LINUX is undef at compile-time:
    $ perl if ($^O eq 'linux') { $LINUX=1; }; use if $LINUX, 'MIDI::ALSA' => ('SND_SEQ_EVENT_PORT_UNSUBSCRIBED', 'SND_SEQ_EVENT_SYSEX'); __END__ $ perl -MMIDI::ALSA Can't locate MIDI/ALSA.pm in @INC (@INC contains: /home/aitap/perl5/li +b/perl5/i486-linux-gnu-thread-multi-64int /home/aitap/perl5/lib/perl5 +/i486-linux-gnu-thread-multi-64int /home/aitap/perl5/lib/perl5 /etc/p +erl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/ +perl5 /usr/share/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/l +ocal/lib/site_perl .). BEGIN failed--compilation aborted.
    But if the test is done in the BEGIN{} section, everything works (well, not for me because of the absence of the module):
    $ perl BEGIN{ if ($^O eq 'linux') { $LINUX=1; }; } use if $LINUX, 'MIDI::ALSA' => ('SND_SEQ_EVENT_PORT_UNSUBSCRIBED', 'SND_SEQ_EVENT_SYSEX'); Can't locate MIDI/ALSA.pm in @INC (@INC contains: /home/aitap/perl5/li +b/perl5/i486-linux-gnu-thread-multi-64int /home/aitap/perl5/lib/perl5 +/i486-linux-gnu-thread-multi-64int /home/aitap/perl5/lib/perl5 /etc/p +erl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/ +perl5 /usr/share/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/l +ocal/lib/site_perl .) at /usr/share/perl/5.14/if.pm line 13. BEGIN failed--compilation aborted at - line 3.
    Sorry if my advice was wrong.
      Thank you, that explains why I had to use:

      use if ($^O eq 'linux'), 'MIDI::ALSA'

      and why any other alternative with $LINUX I tried didn't work!
Re^2: How to have OS specific code sections in Perl
by perltux (Monk) on Oct 31, 2012 at 17:36 UTC
    Thanks, this works great (apart from the second 'use' after the comma in the 'use if' line which is incorrect) and does exactly what I wanted!
      You're welcome.

      Thanks for pointing out the copy'n'paste error; I updated the post to delete it.

Re^2: How to have OS specific code sections in Perl
by perltux (Monk) on Oct 31, 2012 at 18:43 UTC
    The 'use if' line seems to work only if written as follows:

    use if ($^O eq 'linux'), 'MIDI::ALSA' => ('SND_SEQ_EVENT_PORT_UNSUBSCR +IBED', 'SND_SEQ_EVENT_SYSEX');

    Any other way to write the 'use if' CONDITION doesn't seem to work.
    Weird...
Re^2: How to have OS specific code sections in Perl
by perltux (Monk) on Oct 31, 2012 at 18:00 UTC
    Actually unfortunately I spoke to soon, the code now works fine in Windows (no errors anymore) but now I get an error in Linux:

    Undefined subroutine &MIDI::ALSA::client called at ./test.pl line 15

    It looks like the 'use if' line needs some more tweaking to work correctly, but how?

      The problem is that the conditional block is only evaluated at run time, by which time it's too late for use if.

      You want:

      my $LINUX; BEGIN { $LINUX = ($^O eq 'linux') }; use if $LINUX, 'MIDI::ALSA' => ('SND_SEQ_EVENT_PORT_UNSUBSCRIBED', 'SN +D_SEQ_EVENT_SYSEX');

      Or better:

      use if ($^O eq 'linux'), 'MIDI::ALSA' => ('SND_SEQ_EVENT_PORT_UNSUBSCR +IBED', 'SND_SEQ_EVENT_SYSEX');
      perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1001713]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (6)
As of 2024-04-18 05:37 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found