2016-04-01 4 views
1

私は引数として渡されるファイルのinodeだけを取得しようとしています。なぜperlで印刷すると新しい行に0があるのですか?

ただし、iノードを抽出すると、新しい行に0が出力されます。私は正規表現でそれを取り除こうとしましたが、できません。スクリプトを渡しています/usr/bin/vimコマンド(ls -i /usr/bin/vim | awk '{print $1}')を実行すると0は表示されませんが、スクリプトを実行すると表示されます。

どうすればこの0を取り除くことができますか?

my $filepath = $ARGV[0]; 
chomp $filepath; 
$filepath =~ s/\s//g; 

print ("FILEPATH: $filepath\n"); #looks good 
my $inode = system("ls -i $filepath | awk '{print \$1}'"); 

$inode =~ s/[^a-zA-Z0-9]//g; 
$inode =~ s/\s//g; 
print ("$inode\n"); 

だから私の結果は

137699967 
0 
+2

だから 'ls -i/usr/bin/vim'だけで' vim'とタグ付けされた質問はありますか? – Kent

+2

docs: 'perldoc -f system'を読んでください。 'qx'を使うべきです。 'stat'もあなたにinodeを与えます。 – toolic

+0

参考:http://stackoverflow.com/questions/799968/whats-the-difference-between-perls-backticks-system-and-exec – mob

答えて

2

、だけではなく、

print (stat($filepath))[1]."\n"; 

print join "\n", map { (stat)[1] } @ARGV,"\n" 
3

あなたがsystemを起動するときは、その引数として提供されたコマンドを実行し、それはだ組み込みstatを使用しないでくださいですinode番号を出力しているもの。 system

戻り値は、この場合には0であり、それがどのようなあなたのその後のprintコール出力のコマンド実行の終了コード、です。外部プログラムを実行し、その出力をキャプチャし、そのように、qx演算子を使用するには

my $inode = qx/ls -i $filepath | awk '{print \$1}'"/; 

Sobriqueがその答えで説明したようにしかし、あなたが実際に外部プログラムを呼び出す必要はありません、代わりにPerlに組み込まれているstat関数を使うことができます。

my $inode = stat($filepath)[1]; 

statファイルに関するさまざまな情報を含むリストを返します - インデックス1は、そのiノードを保持しています。このコードは、ファイルが存在しない場合は処理しません。

関連する問題