Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

Mac Space in Path

by Anonymous Monk
on May 22, 2013 at 18:26 UTC ( #1034799=perlquestion: print w/ replies, xml ) Need Help??
Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

I've not been able to solve the problem of space bands in paths on Mac.

chomp (my $metadata_file = <>); $metadata_file =~ s/\s$//; open FILE, "$metadata_file"; $metadata = join '', <FILE>;

It currently produces a "readline() on closed filehandle FILE" if there is a space in the path. I've done a lot of research and the answer is quoting the path. I think I've done that. I'm running perl5.10.0 on MacOS 10.6.8.

Any help would be greatly appreciated.

Comment on Mac Space in Path
Download Code
Re: Mac Space in Path
by hardburn (Abbot) on May 22, 2013 at 18:51 UTC

    First off, you should check that the open call returns successfully, e.g.:

    open FILE, "$metadata_file" or die "Could not open '$metadata_file': $!\n";

    Which in this case, I believe, would tell you that the file does not exist. The trouble is that if there's a space in the path, then that really is a part of the file, so you're asking for a completely different file by removing the space.

    Note that chomp would have already removed trailing spaces, so your listed regex is redundant.

    I think you can simply pass the filename to open without modifying it to remove spaces. If not, then you need to escape the spaces rather than removing them. For instance, the file name "foo bar.txt" would become "foo\ bar.txt".


    "There is no shame in being self-taught, only in not trying to learn in the first place." -- Atrus, Myst: The Book of D'ni.

Re: Mac Space in Path
by vsespb (Hermit) on May 22, 2013 at 19:36 UTC
    1. Don't remove spaces from filename. 2. Use 3-arguments open (see documentation). 2-argument open won't work if there are leading spaces in filename.
Re: Mac Space in Path
by fishmonger (Pilgrim) on May 22, 2013 at 22:18 UTC

    I think we need a little more info/context.

    How are you executing the script?

    Are you passing the file path as a command line arg, or is it in a file that is passed as an arg or piped to the script?

    Did you try dumping out $metadata_file (via Data::Dumper) prior to the open call to see if it held the value you expected?

    There's no need to quote $metadata_file in the open call as demonstrated in the following example

    #!/usr/bin/perl use strict; use warnings; use Data::Dumper; my $filepath = 'C:\Program Files\Internet Explorer\ie9props.propdesc'; open my $fh, '<', $filepath or die "can't open '$filepath' $!"; my $file_contents = join '', <$fh>; print $file_contents;
    outputs:
    &#8745;&#9559;&#9488;<?xml version="1.0" encoding="utf-8"?> <!-- The properties in this file cover the following: Microsoft.IE.* --> <schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="h +ttp://schemas.microsoft.com/windows/2006/propertydescription" schemaV +ersion="1.0"> <propertyDescriptionList publisher="Microsoft" product="Internet E +xplorer"> <propertyDescription name="Microsoft.IE.FeedItemLocalId" forma +tID="{E32596B0-1163-4E02-867A-12132DB4BA06}" propID="2"> <searchInfo inInvertedIndex="false" isColumn="true" maxSiz +e="256"/> <typeInfo type="String" isViewable="false"/> </propertyDescription> <propertyDescription name="Microsoft.IE.SelectionCount" format +ID="{1CE0D6BC-536C-4600-B0DD-7E0C66B350D5}" propID="2"> <searchInfo inInvertedIndex="false" isColumn="true"/> <typeInfo type="UInt32" isViewable="false"/> </propertyDescription> <propertyDescription name="Microsoft.IE.TargetUrl" formatID="{ +1CE0D6BC-536C-4600-B0DD-7E0C66B350D5}" propID="3"> <searchInfo inInvertedIndex="true" isColumn="true" maxSize +="4168"/> <typeInfo type="String" isViewable="false" isQueryable="tr +ue"/> </propertyDescription> <propertyDescription name="Microsoft.IE.TargetUrlHostName" for +matID="{1CE0D6BC-536C-4600-B0DD-7E0C66B350D5}" propID="4"> <searchInfo inInvertedIndex="true" isColumn="true" maxSize +="512"/> <typeInfo type="String" isViewable="false" isQueryable="tr +ue"/> </propertyDescription> <propertyDescription name="Microsoft.IE.TargetUrlPath" formatI +D="{1CE0D6BC-536C-4600-B0DD-7E0C66B350D5}" propID="5"> <searchInfo inInvertedIndex="true" isColumn="true" maxSize +="4168"/> <typeInfo type="String" isViewable="false" isQueryable="tr +ue"/> </propertyDescription> <propertyDescription name="Microsoft.IE.Title" formatID="{1CE0 +D6BC-536C-4600-B0DD-7E0C66B350D5}" propID="6"> <searchInfo inInvertedIndex="true" isColumn="true" maxSize +="4168"/> <typeInfo type="String" isViewable="false" isQueryable="tr +ue"/> </propertyDescription> <propertyDescription name="Microsoft.IE.VisitCount" formatID=" +{1CE0D6BC-536C-4600-B0DD-7E0C66B350D5}" propID="7"> <searchInfo inInvertedIndex="false" isColumn="true"/> <typeInfo type="UInt32" isViewable="false"/> </propertyDescription> </propertyDescriptionList> </schema>

      Thank you so much for your responses. I implemented and tested different permutations of the suggestions listed here. I also added a line to print the path $metadata_file, so I could keep track of what the script was opening if it was able to open the file and not die:

      print "\n\nPlease drop the metadata file [vendor instructions/isbn13.x +ml]:\n\n\t\t>>>"; chomp (my $metadata_file = <>); print $metadata_file; #$metadata_file =~ s/\s$//; open (FILE, "<", "$metadata_file") or die "Could not open '$metadata_f +ile': $!\n"; $metadata = join '', <FILE>;

      First, I commented out the line that deletes the trailing space from the user input. I noticed that the chomp() was not working the same after OSX 10.4, so I had to implement the line (We're a small Mac typehouse and all of our machines have slightly different implementations of perl. The trailing space works on some machines and not on others, but no trailing space works on all.):

      $metadata_file =~ s/\s$//;

      When I comment it out, you'll see that the trailing space is still there and the space between "vendor" and "instructions" has been escaped:

      Please drop the metadata file [vendor instructions/isbn13.xml]: >>>/Users/jefe/Desktop/vendor\ instructions/9781118172773.xml Could not open '/Users/jefe/Desktop/vendor\ instructions/9781118172773 +.xml ': No such file or directory

      The script opens the file and reads it in perfectly if I simply delete the space in the path:

      Please drop the metadata file [vendor instructions/isbn13.xml]: >>>/Users/jefe/Desktop/vendorinstructions/9781118172773.xml /Users/jefe/Desktop/vendorinstructions/9781118172773.xml

      I also tried not using quotes around $metadata_file in the open command and it successfully commented out the space:

      Please drop the metadata file [vendor instructions/isbn13.xml]: >>>/Users/jefe/Desktop/vendor\ instructions/9781118172773.xml Could not open '/Users/jefe/Desktop/vendor\ instructions/9781118172773 +.xml': No such file or directory

      To answer your question, fishmonger, the metadata_file is simply being inserted at the top of every document the script produces, so I open it, join it, format it and insert it when I need to in the script.

      This particular piece of code is my test to get it to work, then I can rewrite the other parts of the script that read and write files with space bands. Previously, I simply admonished all our comps to not use space bands in their paths. Unfortunately, the client's CMS inserts space bands at every level, so I need to figure this out. It seems so simple, but it's not working.

      Again, thank you for your help.

        Solution:

        $metadata_file =~ s/\\//;

        Apparently, Mac OSX Perl doesn't want the space band escaped. It likes a bare space in the path.

        Again, thank you for your help.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://1034799]
Approved by Paladin
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others chanting in the Monastery: (12)
As of 2014-11-28 10:21 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My preferred Perl binaries come from:














    Results (195 votes), past polls