2016-04-02 4 views
-2

をperlへのbashスクリプトコードを:変更bashで

#!/bin/bash 
var=$(cat ps.txt) 
for i in $var ; do 
echo $i 
done 

とps.txtは次のとおりです。

356735 
535687 
547568537 
7345673 
3653468 
2376958764 
12345678 
12345 

は今、私はPerlでそれをやりたいか、私は出力を保存する方法を知りたいです代わりに、Perlの変数にファイルの内容を取得するためにcatを使用してのvar=$(cat ps.txt)

+1

'私を読みながら、 echo "$ i"; done chepner

+0

@chepner Perlでそれをしたいです –

答えて

0

はそれを行うにはいくつかの方法があります。

#!/usr/bin/perl 

$ifile = "ps.txt"; 

# capture command output 
# NOTE: this puts each line in a separate array element -- the newline is _not_ 
# stripped 
@bycat = (`cat $ifile`); 

# this strips the newline from all array elements: 
chomp(@bycat); 

# so would this: 
# NOTE: for this type of foreach, if you modify $buf, it also modifies the 
# corresponding array element 
foreach $buf (@bycat) { 
    chomp($buf); 
} 

# read in all elements line-by-line 
open($fin,"<$ifile") or die("unable to open '$ifile' -- $!\n"); 
while ($buf = <$fin>) { 
    chomp($buf); 
    push(@byread,$buf); 
} 
close($fin); 

# print the arrays 
# NOTE: we are passing the arrays "by-reference" 
show("bycat",\@bycat); 
show("byread",\@byread); 

# show -- dump the array 
sub show 
# sym -- name of array 
# ptr -- reference to array 
{ 
    my($sym,$ptr) = @_; 
    my($buf); 

    foreach $buf (@$ptr) { 
     printf("%s: %s\n",$sym,$buf); 
    } 
} 
1

のようなPerlで変数内のコマンドの、あなたは「中open<>を使用する必要があります吸い込みモード」:

open my $fh, "<", "ps.txt" or die "Failed to open ps.txt: $!"; 
local $/; 
my $file_contents = <$fh>; 
+0

コードを説明してください。 –

+0

'open'はかなり自明です。 '<>'はファイルの内容を返し、レコードごとに(デフォルトでは行ごとに)記録します。ファイル全体を1つのレコードとして返すには、レコード区切り変数 '$ /'をunsetする必要があります。これは 'local $ /;'で実現します。 – bart

+0

元の 'bash'コードは内容を一行ずつ(間違っていても)繰り返します。したがって、' $/'だけを残して、' my @file_contents = <$fh>;を使用する方が正しいでしょう。 – chepner

0

私はこれが達成しようとしているかわからないんだけど、これが私の答えです:あなたが行が必要な場合は

my $var = `/bin/cat $0`; # the Perl program itself ;-) 
print $var; 

$var$/に分割することができます。ここで

#! /usr/bin/perl -w 
my $var = `/bin/cat $0`; 
print $var; 
my $n = 1; 
for my $line (split($/, $var)){ 
    print "$n: $line\n"; 
    $n++; 
} 
+0

'$ 0'はスクリプトの名前で、_not_の引数はゼロです(例えば、' foo bar'、 '$ 0'は" foo "、_not_" bar ")。 perlでは、コマンドライン引数は[@ ARGV]の配列に入っています。だから、 '$ 0'を' $ ARGV [0] 'に置き換えてください。 –

+0

@CraigEstey私はテストのためにPerlプログラム自体を使用していました:-)しかし、私はそれを明確にすべきでした。 – laune

+0

私はそれを "うんざり"していないし、20 +のperlをやっている。コメントは物事を「修正」します。 –

関連する問題