The UNIX and Linux Forums  
Hello and Welcome from United States to the UNIX and Linux Forums! Thank You for Visiting and Joining Our Global Community.

Go Back   The UNIX and Linux Forums > Top Forums > Shell Programming and Scripting
.
google unix.com



Shell Programming and Scripting Post questions about KSH, CSH, SH, BASH, PERL, PHP, SED, AWK and OTHER shell scripts and shell scripting languages here.

More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
perl -write values in a file to @array in perl meghana Shell Programming and Scripting 27 06-07-2009 05:05 PM
Accessing single elements of a awk array in END timj123 Shell Programming and Scripting 6 06-20-2008 04:53 PM
Perl - New line in array elements bperl Shell Programming and Scripting 4 04-03-2008 09:56 PM
pass each elements in array to ssytem command jaganadh Shell Programming and Scripting 0 12-14-2007 06:57 AM
accessing variables declared in another perl script gurukottur Shell Programming and Scripting 3 11-09-2006 09:22 PM

Closed Thread
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish Powered by Powered by Google
 
LinkBack Thread Tools Search this Thread Rate Thread Display Modes
  #1 (permalink)  
Old 10-02-2008
userix userix is offline
Registered User
  
 

Join Date: May 2008
Posts: 21
[Perl] Accessing array elements within a sed command in Perl script

I am trying to use a script to replace the header of each file, whose filename are stored within the array $test, using the sed command within a Perl script as follows:
Code:
$count = 0;
while ( $count < $#test )
{
        `sed -e 's/BIOGRF  321/BIOGRF  332/g' ${test[$count]} > 0`;
        `cat 0 > ${test[$count]}`;
        $count++;
}

`rm 0`;
This script doesn't work as is and I think it might be something with the syntax of how to call the element of an array within a embedded sed command. If I put an actual integer as the array index instead of the variable $count, it works fine, but if I try to use $count, it doesn't work at all. I know this might not be the most efficient method, but it is the only way I can think of with my limited knowledge of perl scripting.
  #2 (permalink)  
Old 10-03-2008
otheus's Avatar
otheus otheus is offline Forum Staff  
Moderator ala Mode
  
 

Join Date: Feb 2007
Location: Innsbruck, Austria
Posts: 1,884
First, why would you use such a sed script within Perl? But whatever. Second, the second back-ticked command, while functionally correct, is not as good or as clear as:
Code:
rename(0, ${test[$count]});
Third, the last one in the array never gets converted. That's because $#test is the last index in the array of @test, and you're telling the while loop to stop before count is equal to this.

Now to your actual question. I dont know. This worked when I ran sample code and on the files (except for the last). However, better code would be as follows:

Code:
for (@test)
{
        system("sed -i -e 's/BIOGRF  321/BIOGRF  332/g' $_");
}
  #3 (permalink)  
Old 10-03-2008
SFNYC SFNYC is offline
Registered User
  
 

Join Date: Jun 2008
Location: New York City
Posts: 95
Like otheus said, why use sed in a Perl script? If you are going to use Perl, you had better learn how to use it properly. Otherwise stick with sed.

Here's a small Perl script that will do what you want and create a backup file to boot.

I called this replace.pl

Code:
#!/usr/bin/perl

use strict;
use warnings;
use English qw( -no_match_vars );

my $old;
my $new;
my $oldFH;
my $newFH;
my $dirDH;

my $dir = ".";  #Use current directory

opendir($dirDH, $dir) or die "Cannot opendir $dir\n";

my @test = readdir($dirDH);

foreach $old (@test) {
    next if $old eq '.';  #skip directory entries
    next if $old eq '..';

    $new = "$old.temp";
    open($oldFH, "<", $old)        or die "can't open $old: $OS_ERROR\n";
    open($newFH, ">", $new)        or die "can't open $new: $OS_ERROR\n";
    while (<$oldFH>) {
        $_ =~ s/BIOGRF  321/BIOGRF  332/g;
        print $newFH $_            or die "can't write $new: $OS_ERROR\n";
    }

    close($oldFH)                  or die "can't close $old: $OS_ERROR\n";
    close($newFH)                  or die "can't close $new: $OS_ERROR\n";
    rename($old, "$old.orig")      or die "can't rename $old to $old.orig: $OS_ERROR\n";
    rename($new, $old)             or die "can't rename $new to $old: $OS_ERROR\n";

}

closedir($dirDH) or die "Cannot closedir $dir\n";

exit 0;
Output:

Code:
$ ls -1
test1
test2
test3
test4

$ cat test1 test2 test3 test4
BIOGRF  321
BIOGRF  421
BIOGRF  32X
BIOGRF  199

$ replace.pl

$ cat test1 test2 test3 test4
BIOGRF  332
BIOGRF  421
BIOGRF  32X
BIOGRF  199


$ ls -1
test1
test1.orig
test2
test2.orig
test3
test3.orig
test4
test4.orig

The guts of the code comes from The Perl Cookbook. I just wrapped it around a loop that takes all the files from the current directory and performs your replace command. In your case you just need the while loop that walks through your array called @test.
Sponsored Links
Closed Thread

Bookmarks

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On




All times are GMT -4. The time now is 07:09 AM.


Powered by: vBulletin, Copyright ©2000 - 2006, Jelsoft Enterprises Limited. Language Translations Powered by .
vBCredits v1.4 Copyright ©2007 - 2008, PixelFX Studios
The UNIX and Linux Forums Content Copyright ©1993-2009. All Rights Reserved.Ad Management by RedTyger

Content Relevant URLs by vBSEO 3.2.0