in reply to Re^3: getting a few simple scripts to work on windows
in thread getting a few simple scripts to work on windows

Your recollections and posted code check out. Bravo! I consider this a strong result for untangling a windows 10 machine:

#!/usr/bin/perl use warnings; use 5.016; ## File::Find for windows, handling junctions ## https://perlmonks.org/?node_id=11104464 use File::Find; use Cwd; ## https://metacpan.org/pod/Win32API::File use Win32API::File qw'GetFileAttributes :FILE_ATTRIBUTE_'; use File::Basename; my $current = cwd; my $VERBOSE = 1; find( \&pm_beneath, $current, ); say "--------------"; find( \&pm_beneath, "C:/Strawberry", ); sub isjunc { return GetFileAttributes( $_[0] ) & FILE_ATTRIBUTE_REPARSE_POINT; } sub pm_beneath { if (-d) { # junctions show up as TRUE for `-d` if ( isjunc($File::Find::name) ) { # if junction, don't bother creating checking destination direct +ory existence, # and don't try to recurse into it $File::Find::prune = 1; printf( "[%s] %-12s'%s'\n", scalar(localtime), "JUNCTION:", $File::Find::name ) if ($VERBOSE); return; } } my $basename = basename($File::Find::name); return unless $basename =~ /\.pm$/; print "$File::Find::name\n"; my $access_age = -A $basename; print " $basename\n"; printf "access age in days: %.2f\n", $access_age; } __END__
(File::Find) just prints a warning, but otherwise cannot do anything with the junction -- but other than that, it works fine in windows... and even with junctions, it just gives a warning, so it continues to effectively work.

I understand and agree now. The other script I presented in the original post is still ailing:

I got the system command right on this one, but I'm trying to not have to read in a template file to make code tags, so I'm trying to use the fill_in_string method from Text::Template. My imitation of examples is not working:

C:\Users\tblaz\Documents\evelyn>perl 5.monk.tag.pl No such class Q::symbol at 5.monk.tag.pl line 68, near "my Q::symbol" syntax error at 5.monk.tag.pl line 68, near "my Q::symbol =" Execution of 5.monk.tag.pl aborted due to compilation errors. C:\Users\tblaz\Documents\evelyn>

Source that produced this is:

#!/usr/bin/perl -w use 5.011; use Path::Tiny; use POSIX qw(strftime); # initialization that must precede main data structure # User: enter a subdirectory you would like to create # enter a subdirectory of this^^^ for output my $ts = "template_stuff"; my $output = "translations"; ## turning things to Path::Tiny my $abs = path(__FILE__)->absolute; my $path1 = Path::Tiny->cwd; my $path2 = path( $path1, $ts ); say "abs is $abs"; say "path1 is $path1"; say "path2 is $path2"; print "This script will build the above path2. Proceed? (y|n)"; my $prompt = <STDIN>; chomp $prompt; die unless ( $prompt eq "y" ); my $template_file = "1.tags.tmpl"; my $abs_to_template = path( $path2, $template_file )->touchpath; # script params my %vars = ( monk_tags => path( $path2, $template_file ), translations => path( $path2, $output ), book => 'monastery tags ', ); my $rvars = \%vars; my $return1 = write_monk_tags($rvars); say "return1 is $return1"; my $munge = strftime( "%d-%m-%Y-%H-%M-%S", localtime ); $munge .= ".monk.txt"; # use Path::Tiny to create and write to a text in relevant directory my $save_file = path( $vars{$output}, $munge )->touchpath; my $return2 = $save_file->spew_utf8($return1); say "return2 is $return2"; say "created file $save_file"; system( 1, 'C:\Program Files (x86)\Notepad++\notepad++.exe', $save_fil +e ); sub write_monk_tags { use warnings; use 5.011; use Text::Template 'fill_in_string'; my $rvars = shift; my %vars = %$rvars; my $tag_pair = '<{$symbol}></{$symbol}>'; my $return; # User: change these quoted values for different order or tags my @buchstaben = qw/i p c pre readmore b/; for my $i (@buchstaben) { $vars{"symbol"} = $i; print "How many $i tag pairs would you like?: "; my $prompt = <STDIN>; chomp $prompt; while ( $prompt gt 0 ) { my Q::symbol = $i; my $result = fill_in_string( $tag_pair, PACKAGE => Q ); $return = $return . $result; --$prompt; } } return $return; } __END__

The earlier version that goes like this does not compile either:

sub write_monk_tags { use warnings; use 5.011; use Text::Template 'fill_in_string'; my $rvars = shift; my %vars = %$rvars; # User: change these quoted values for different order or tags my @buchstaben = qw/i p c pre readmore b/; for my $i (@buchstaben) { $vars{"symbol"} = $i; print "How many $i tag pairs would you like?: "; my $prompt = <STDIN>; chomp $prompt; while ( $prompt gt 0 ) { my Q::symbol = $i; my $result = fill_in_string(<<'EOM', PACKAGE => Q); <{$symbol}></{$symbol}> EOM; $return = $return . $result; --$prompt; } return $return; }

This syntax draws the same error. Documentation for this method is here: fill_in_string

Can I make a template from a garden variety lexical variable?

Thanks for comments,

Replies are listed 'Best First'.
Re^5: getting a few simple scripts to work on windows
by Aldebaran (Curate) on Aug 21, 2019 at 17:51 UTC
    Can I make a template from a garden variety lexical variable?

    When I'm silent on threads where I've asked questions, it is usually time where I hit the reading that responders post and try out all the elbow grease I can muster, as I make keystrokes writing scripts that are imperfect. Occasionally, I get a couple good ones to post, and I think this falls into that category.

    Text::Template is too big a hammer for this nail. Native perl is enough.

    my $tag_pair = '<x></x>'; new_string =~ s/x/${letter}/g;

    The system call at the end of this is for windows. I intend to ask the perl hive mind how to make a grown-ups' switch control to probe for what OS the script is being run on, but not here, as the premise that I was on a windows machine was in the original post. Furthermore, I'm 5 deep in terms of the response levels, and I don't want to start anything new. It's impossible to show the output without running a script on it to substitute out special characters, the ones you always need in better writeups. We want to end up with a real file, so we can make that the basis of showing code and discussing it in terms of other sources on pm and the internet. Better writeups reference others, IMO. I guess what I can show for output is the ultimate file created by Path::Tiny:

    created file C:/Users/tblaz/Documents/evelyn/perlmonks/writeups/21-08-2019-10-33-27.monk.txt

    Source:

    #!/usr/bin/perl -w use 5.011; use Path::Tiny; use POSIX qw(strftime); # initialization that must precede main data structure # User: enter a subdirectory you would like to create # enter a subdirectory of this^^^ for output my $ts = "perlmonks"; my $output = "writeups"; ## turning things to Path::Tiny my $abs = path(__FILE__)->absolute; my $path1 = Path::Tiny->cwd; my $path2 = path( $path1, $ts ); say "abs is $abs"; say "path1 is $path1"; say "path2 is $path2"; print "This script will build the above path2. Proceed? (y|n)"; my $prompt = <STDIN>; chomp $prompt; die unless ( $prompt eq "y" ); ## special do-hickeys I want at the end my @list = ( '[id://3989]', '[|]', '[|]', '&lt;', '&gt;', '&#91;', '&# +93;' ); @list = map { "$_\n" } @list; say "list is @list"; my $return1 = write_monk_tags(); say "return1 is $return1"; my $munge = strftime( "%d-%m-%Y-%H-%M-%S", localtime ); $munge .= ".monk.txt"; # use Path::Tiny to create and write to a text in relevant directory my $save_file = path( $path2, $output, $munge )->touchpath; my $return2 = $save_file->spew($return1); say "return2 is $return2"; my $return3 = $save_file->append(@list); say "return3 is $return3"; say "created file $save_file"; system( 1, 'C:\Program Files (x86)\Notepad++\notepad++.exe', $save_fil +e ); sub write_monk_tags { use warnings; use 5.011; my $tag_pair = '<x></x>'; my $return = ''; # User: change these quoted values for different order or tags my @buchstaben = qw/i p c pre readmore b/; for my $letter (@buchstaben) { print "How many $letter tag pairs would you like?: "; my $prompt = <STDIN>; chomp $prompt; while ( $prompt gt 0 ) { my $new_string = $tag_pair; $new_string =~ s/x/${letter}/g; say "new string is $new_string"; $return = $return . $new_string . "\n"; --$prompt; } } return $return; } __END__

    Of course, I'll consider any criticism of this. Thx pryrt for your comments to get me moving on this new machine.