Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much
 
PerlMonks  

Re: reading array elements

by jonadab (Parson)
on Nov 26, 2008 at 12:54 UTC ( #726096=note: print w/replies, xml ) Need Help??


in reply to reading array elements

I'm trying to figure out what you want this script to do, and I'm coming up blank. The best I can do for turning it into anything meaningful is as follows:

open my $datfh, '<', 'C:\begperl\my scripts\cdata.txt' or die "Couldn' +t open file: $!\n"; while (<$datfh>) { print "**** Processing new input line\n"; my @fields = (map { s/^\s+//; s/\s+$//; # eliminate irrelevant spaces $_ } split /\|/, $_); for my $i (0 .. $#fields) { print " * '$fields[$i]'\n" unless $fields[$i] =~ /\r|\n/; } }

This, of course, doesn't actually do anything. It just reads reads the file and tells you what it's reading, which you could have got just about as well by opening the file itself in a text editor and looking at it. But from just reading the information you gave us, I wasn't able to figure out what processing you wanted the script to do.

-- 
We're working on a six-year set of freely redistributable Vacation Bible School materials.

Replies are listed 'Best First'.
Re^2: reading array elements
by jeah (Novice) on Nov 28, 2008 at 07:32 UTC

    Thanks very much for the feedback, everyone and sorry about any confusion, I hope my questions aren't trivial. I've 4 further questions on Revised Code Below, thanks very much in advance.

    1. If I use $in on Lines 6 - 8 and print any elements, the entire lines of the file are returned without being processed (with pipes included). I thought I could substitute $_ with any variable. Why won't it work here?

    2. If I use $_ on these lines instead, then I get good results (the specified element on Line 12.

    3. If I UnComment Lines 9 - 11, a '1' is returned between the last 2 elements in each line. Why is that?

    4. To clarify myself (on moritz's question), even-numbered elements return nothing, eg. if I type print $fields[0], "\r"; on line 12 in my revised script, I get nothing. I've found that any even number gives me nothing, it's odd, I thought the 0th element would be 'Baw', the 1st element would be 'Vao' and so on. The pipe is discarded by perl, so I don't understand why the even-numbered elements are 'skipped', so to print 'Baw', I type print $fields1, "\r" and to print 'Vao', I type print $fields3, "\r"

    1 #!/usr/bin/perl -w 2 use strict; 3 4 open my $datfh, '<', 'C:\begperl\my scripts\cdata.txt' or die "Could +n't open file: $!\n"; 5 6 foreach my $_ (<$datfh>) { 7 my @fields = (map { s/^\s+//; s/\s+$//, $_ } # eliminates irr +elevant spaces 8 split /\|/, $_); 9 # for my $i (0 .. $#fields) { 10 # print $fields[$i], "\n" unless $fields[$i] =~ /\r|\n/; 11 # } 12 print $fields[1], "\r"; 13 } 14 close $datfh;

      Hi, sorry it took me so long to get back to you on this; I had a couple of busy weeks and didn't look at Perlmonks. But anyway, in case you're still interested, I'll go ahead and answer now...

      If I use $in on Lines 6 - 8 and print any elements, the entire lines of the file are returned without being processed (with pipes included). I thought I could substitute $_ with any variable. Why won't it work here?

      $_ is magic, and sometimes refers to different things according to context. In particular, map assigns each of the things in the list to $_ in turn and uses the codeblock to transform them, so when you use $_ inside a map codeblock, it refers to one item in the list that you are mapping over. You can and should use a different variable outside the map (and, indeed, the code as you have it now won't compile because you tried to scope $_ lexically; changing it to $in fixes this), but inside the map codeblock the $_ has special meaning, and you need it there.

      If I UnComment Lines 9 - 11, a '1' is returned between the last 2 elements in each line. Why is that?

      Because one substitution was made. The substitution operator (s///) returns undef when there were no substitutions made, but otherwise it returns the number of substitutions performed. If you don't understand why the return value of the substitution operation is appearing in your output, you should maybe look at the syntax in your map operation more closely. You're returning a list of two things for each one thing in the input list. (If this is not what you want, you can return only the last item by changing the comma to a semicolon.)

      even-numbered elements return nothing

      If you change your data so that they include more trailing spaces, you'll get numbers there instead of nothing. But if you don't want those values at all, you can change the map operation as mentioned above.

      -- 
      We're working on a six-year set of freely redistributable Vacation Bible School materials.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://726096]
help
Chatterbox?
[choroba]: Algorithm::Loops
[Corion]: choroba: I'm using that to generate the permutations, but I don't know how the user can pass the intended values to my function in a sane way
[Corion]: I have a prototype that permutes the get_parameters, but the values used for the get parameters should be different from the values used for the headers and potentially for parts of the URL
[Corion]: But yes, in general, my approach will be "split the URL into another set of parameters, generate an array of allowed values for each parameter and then NestedLoops() over the set"
[choroba]: hmm... so you need something like bag from Test::Deep, but not for checking, but for generation
[Corion]: This has the dual use of easily requesting sequential URLs and also being suitable for testing
[Corion]: For testing, I want to skip all tests with the same value(s) once one test fails to cut down on the number of failing tests
[Corion]: choroba: Yes, in a way I
[Corion]: ... I'm treating the incoming value sets as bags... Maybe I'll just put the burden on the user, at least in the first attempt at a full API. generate( headers => [{ 'Content-Type' => 'text/plain' }, {'Content-Type' => 'text/json' ] ), even ...
[Corion]: ... if that is cumbersome for the caller to specify. On the other hand, maybe there isn't that big a need for permuting the header values

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (5)
As of 2017-01-17 08:22 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    Do you watch meteor showers?




    Results (152 votes). Check out past polls.