Loading ...
Sorry, an error occurred while loading the content.

Re: [PBML] Please help with String Manipulation issue

Expand Messages
  • Bob Kardell
    I have tried using the paragraph mode in the past with some success, but this issue brought up a question I have had - is it possible to define $/ two
    Message 1 of 14 , Mar 4, 2007
    • 0 Attachment
      I have tried using the paragraph mode in the past with some success, but this issue brought up a question I have had - is it possible to define "$/" two different ways in the same script? In the past when I have tried to redefine $/ to something other than the default I have had to create separate scripts. I noticed that you put the following code in:


      {

      local $/ = "";

      @data = <>; # slurp all input in paragraph mode

      }

      is it possible to do something like:


      {

      local $/ = "";

      @data = <>; # slurp all input in paragraph mode

      }

      #do some code here

      {

      local $/ = "\n\n";

      @data = <>; # slurp all input in paragraph mode

      }

      #do something else here

      When I have tried this in the past, the two separate $/ have not worked nicely with one another and I have to use two separate scripts because of it. I am obviously missing something.

      Thanks,

      Bob

      ----- Original Message ----
      From: "merlyn@..." <merlyn@...>
      To: Denham Eva <denhameva@...>
      Cc: perl-beginner@yahoogroups.com
      Sent: Friday, February 16, 2007 2:07:45 PM
      Subject: Re: [PBML] Please help with String Manipulation issue













      >>>>> "Denham" == Denham Eva <denhameva@gmail. com> writes:



      Denham> ------------ -----Begin File Example----- --------- ------



      Denham> The Executive Director

      Denham> The Farmer

      Denham> PO Box 8051

      Denham> Townname

      Denham> 1000



      Denham> The Director

      Denham> Kitty Veterinary Services

      Denham> Private Bag X2

      Denham> Waterfall

      Denham> 2023



      Denham> ------------ -------Example End--------- ---------

      Denham> The output I am trying to achive is.

      Denham> ------------ -------Example Output------ --------

      Denham> The Executive Director;The Farmer;PO Box 8051;Townname; 1000

      Denham> The Director;Kitty Veterinary Services;Private Bag X2;Waterfall; 2023



      First, you can use "paragraph mode" to break up a file that is separated

      by blank lines. See the variable $/ in "perldoc perlvar", and note that

      it says:



      Setting to "" will treat two or more consecutive empty lines as a single

      empty line.



      So, we can do that:



      my @data;

      {

      local $/ = "";

      @data = <>; # slurp all input in paragraph mode

      }



      The first element of @data is now:



      "The Executive Director\nThe Farmer\nPO Box 8051\nTownname\ n1000"



      We need to turn \n into ; for every element of @data, which can be

      done easily with:



      foreach (@data) {

      tr/\n/;/;

      }



      And now we need to sort them. You didn't see *how* you wanted to sort,

      so the easiest is just to sort alphabetically on each of these strings

      (since the main name comes first):



      @data = sort @data;



      Finally, we need to print that, and we have to add newlines back

      because we've gotten rid of them:



      foreach (@data) {

      print "$_\n";

      }



      That should be pretty close.



      --

      Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095

      <merlyn@stonehenge. com> <URL:http://www.stonehen ge.com/merlyn/>

      Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.

      See PerlTraining. Stonehenge. com for onsite and open-enrollment Perl training!












      <!--

      #ygrp-mlmsg {font-size:13px;font-family:arial,helvetica,clean,sans-serif;}
      #ygrp-mlmsg table {font-size:inherit;font:100%;}
      #ygrp-mlmsg select, input, textarea {font:99% arial,helvetica,clean,sans-serif;}
      #ygrp-mlmsg pre, code {font:115% monospace;}
      #ygrp-mlmsg * {line-height:1.22em;}
      #ygrp-text{
      font-family:Georgia;
      }
      #ygrp-text p{
      margin:0 0 1em 0;
      }
      #ygrp-tpmsgs{
      font-family:Arial;
      clear:both;
      }
      #ygrp-vitnav{
      padding-top:10px;
      font-family:Verdana;
      font-size:77%;
      margin:0;
      }
      #ygrp-vitnav a{
      padding:0 1px;
      }
      #ygrp-actbar{
      clear:both;
      margin:25px 0;
      white-space:nowrap;
      color:#666;
      text-align:right;
      }
      #ygrp-actbar .left{
      float:left;
      white-space:nowrap;
      }
      .bld{font-weight:bold;}
      #ygrp-grft{
      font-family:Verdana;
      font-size:77%;
      padding:15px 0;
      }
      #ygrp-ft{
      font-family:verdana;
      font-size:77%;
      border-top:1px solid #666;
      padding:5px 0;
      }
      #ygrp-mlmsg #logo{
      padding-bottom:10px;
      }

      #ygrp-vital{
      background-color:#e0ecee;
      margin-bottom:20px;
      padding:2px 0 8px 8px;
      }
      #ygrp-vital #vithd{
      font-size:77%;
      font-family:Verdana;
      font-weight:bold;
      color:#333;
      text-transform:uppercase;
      }
      #ygrp-vital ul{
      padding:0;
      margin:2px 0;
      }
      #ygrp-vital ul li{
      list-style-type:none;
      clear:both;
      border:1px solid #e0ecee;
      }
      #ygrp-vital ul li .ct{
      font-weight:bold;
      color:#ff7900;
      float:right;
      width:2em;
      text-align:right;
      padding-right:.5em;
      }
      #ygrp-vital ul li .cat{
      font-weight:bold;
      }
      #ygrp-vital a {
      text-decoration:none;
      }

      #ygrp-vital a:hover{
      text-decoration:underline;
      }

      #ygrp-sponsor #hd{
      color:#999;
      font-size:77%;
      }
      #ygrp-sponsor #ov{
      padding:6px 13px;
      background-color:#e0ecee;
      margin-bottom:20px;
      }
      #ygrp-sponsor #ov ul{
      padding:0 0 0 8px;
      margin:0;
      }
      #ygrp-sponsor #ov li{
      list-style-type:square;
      padding:6px 0;
      font-size:77%;
      }
      #ygrp-sponsor #ov li a{
      text-decoration:none;
      font-size:130%;
      }
      #ygrp-sponsor #nc {
      background-color:#eee;
      margin-bottom:20px;
      padding:0 8px;
      }
      #ygrp-sponsor .ad{
      padding:8px 0;
      }
      #ygrp-sponsor .ad #hd1{
      font-family:Arial;
      font-weight:bold;
      color:#628c2a;
      font-size:100%;
      line-height:122%;
      }
      #ygrp-sponsor .ad a{
      text-decoration:none;
      }
      #ygrp-sponsor .ad a:hover{
      text-decoration:underline;
      }
      #ygrp-sponsor .ad p{
      margin:0;
      }
      o {font-size:0;}
      .MsoNormal {
      margin:0 0 0 0;
      }
      #ygrp-text tt{
      font-size:120%;
      }
      blockquote{margin:0 0 0 4px;}
      .replbq {margin:4;}
      -->







      [Non-text portions of this message have been removed]
    • Jenda Krynicky
      From: Bob Kardell ... You must be, this should work correctly. The local() will make sure the $/ gets reset to the default value at the
      Message 2 of 14 , Mar 6, 2007
      • 0 Attachment
        From: Bob Kardell <bobkardell@...>
        > I have tried using the paragraph mode in the past with some success,
        > but this issue brought up a question I have had - is it possible to
        > define "$/" two different ways in the same script? In the past when I
        > have tried to redefine $/ to something other than the default I have
        > had to create separate scripts. I noticed that you put the following
        > code in:
        >
        >
        > {
        >
        > local $/ = "";
        >
        > @data = <>; # slurp all input in paragraph mode
        >
        > }
        >
        > is it possible to do something like:
        >
        >
        > {
        > local $/ = "";
        > @data = <>; # slurp all input in paragraph mode
        > }
        >
        > #do some code here
        >
        > {
        > local $/ = "\n\n";
        > @data = <>; # slurp all input in paragraph mode
        > }
        >
        > #do something else here
        >
        > When I have tried this in the past, the two separate $/ have not
        > worked nicely with one another and I have to use two separate scripts
        > because of it. I am obviously missing something.

        You must be, this should work correctly. The local() will make sure
        the $/ gets reset to the default value at the end of the block:

        $a = "global value";
        print "$a\n";
        {
        local $a = "local";
        print "$a\n";
        }
        print "$a\n";
        {
        local $a = "other local";
        print "$a\n";
        }
        print "$a\n";


        Try it again and post the code if it doesn't work as expected.

        Jenda
        ===== Jenda@... === http://Jenda.Krynicky.cz =====
        When it comes to wine, women and song, wizards are allowed
        to get drunk and croon as much as they like.
        -- Terry Pratchett in Sourcery
      • a_z0_9_blah
        ... success, but this issue brought up a question I have had - is it possible to define $/ two different ways in the same script? In the past when I have
        Message 3 of 14 , Mar 6, 2007
        • 0 Attachment
          --- In perl-beginner@yahoogroups.com, Bob Kardell <bobkardell@...>
          wrote:
          >
          > I have tried using the paragraph mode in the past with some
          success, but this issue brought up a question I have had - is it
          possible to define "$/" two different ways in the same script? In
          the past when I have tried to redefine $/ to something other than
          the default I have had to create separate scripts. I noticed that
          you put the following code in:
          >
          >
          > {
          >
          > local $/ = "";
          >
          > @data = <>; # slurp all input in paragraph mode
          >
          > }
          >
          > is it possible to do something like:
          >
          >
          > {
          >
          > local $/ = "";
          >
          > @data = <>; # slurp all input in paragraph mode
          >
          > }
          >
          > #do some code here


          see perldoc perlfunc for the function seek().


          >
          > {
          >
          > local $/ = "\n\n";
          >
          > @data = <>; # slurp all input in paragraph mode
          >
          > }
          >
          > #do something else here
          >
          > When I have tried this in the past, the two separate $/ have not
          worked nicely with one another and I have to use two separate
          scripts because of it. I am obviously missing something.
          >
          > Thanks,
          >
          > Bob
        Your message has been successfully submitted and would be delivered to recipients shortly.