আসলটি বজায় রেখে আমি কীভাবে পার্ল প্রতিস্থাপনটি স্ট্রিংয়ে করব?


179

পার্লে, কোনও নিয়মিত এক্সপ্রেশন ব্যবহার করে স্ট্রিংয়ের প্রতিস্থাপন সম্পাদন করা এবং আসলটি পরিবর্তন না করেই ভিন্ন ভেরিয়েবেলে মানটি সংরক্ষণ করার ভাল উপায় কী?

আমি সাধারণত স্ট্রিংটি কেবলমাত্র একটি নতুন ভেরিয়েবলে অনুলিপি করি তারপরে এটিকে s///রিজেক্সের সাথে বেঁধে রাখি যা নতুন স্ট্রিংয়ের প্রতিস্থাপন করে, তবে আমি ভাবছিলাম যে এটি করার আরও ভাল উপায় আছে কিনা?

$newstring = $oldstring;
$newstring =~ s/foo/bar/g;

উত্তর:


256

এটি মূলত আমি সর্বদা আসলটি পরিবর্তন না করে স্ট্রিংয়ের একটি পরিবর্তিত অনুলিপি পেতে ব্যবহার করেছি:

(my $newstring = $oldstring) =~ s/foo/bar/g;

পার্ল 5.14.0 বা তার পরে, আপনি নতুন /r অ-ধ্বংসাত্মক বিকল্প প্রতিস্থাপনকারীটি ব্যবহার করতে পারেন :

my $newstring = $oldstring =~ s/foo/bar/gr; 

দ্রষ্টব্য: উপরের সমাধানগুলিও ছাড়াই কাজ gকরে। তারা অন্য যে কোনও সংশোধককে নিয়েও কাজ করে।


6
কঠোরভাবে ব্যবহারের অধীনে রয়েছে কিনা। ভেরিয়েবলের ন্যূনতম স্কোপিং ++
ysth

আমি ভাবছিলাম এমন কিছু my $new = $_ for $old =~ s/foo/bar;কাজ করবে কিনা ?
বেনোইট

2
@ বেনোইট, আমি বিশ্বাস করি s/foo/bar/ for my $newstring = $oldstring;এটি আপনি কাজ করেছেন বলে বোঝায় তবে এটি অনেক বেশি অবাক।
ইকেগামী

43

বিবৃতি:

(my $newstring = $oldstring) =~ s/foo/bar/g;

যা সমান:

my $newstring = $oldstring;
$newstring =~ s/foo/bar/g;

বিকল্প হিসাবে, পার্ল 5.13.2 হিসাবে আপনি /rএকটি অ ধ্বংসাত্মক বিকল্প ব্যবহার করতে পারেন :

use 5.013;
#...
my $newstring = $oldstring =~ s/foo/bar/gr;

3
আপনি কি gআপনার শীর্ষের রেজিজেসে ভুলে গেছেন ?
মারিওরাফ্ট


10

ওয়ান-লাইনার দ্রবণটি ভাল কোডের চেয়ে শিবলোলেথ হিসাবে বেশি কার্যকর; ভাল পার্ল কোডারগুলি এটি জানবে এবং এটি বুঝতে পারবে, তবে আপনি যে দুটি লাইনের কপি-এবং-সংশোধিত কাপল্ট দিয়ে শুরু করছেন তার চেয়ে এটি স্বচ্ছ এবং পাঠযোগ্য।

অন্য কথায়, এটি করার একটি ভাল উপায় আপনি ইতিমধ্যে এটি যেভাবে করছেন। পাঠযোগ্যতার ব্যয়ে অযৌক্তিক সংক্ষিপ্ত হওয়া কোনও জয় নয়।


আহ, তবে এক লাইনের সংস্করণটি অনিচ্ছাকৃতভাবে ভুল ভুল স্ট্রিং সংশোধন করার প্রশ্নে ত্রুটির সাপেক্ষে নয়।
ysth

ওয়ান লাইন সংস্করণ, <i> সঠিকভাবে কার্যকর করা হলে </ i> এটি সাবজেক্ট নয়, সত্য। তবে এটি একটি পৃথক বিষয়।
জোশ মিল্লার্ড

9
আপনি এটি অপ্রয়োজনীয় সংক্ষিপ্ত ধারণা করতে পারেন, তবে একবার ব্যবহার করতে একটি ভেরিয়েবলের নাম দুটি টাইপ করা ব্যর্থতার পয়েন্টের দ্বিগুণ। ভাষা শিখতে পারে এমন লোকদের জন্য এটি পুরোপুরি পাঠযোগ্য এবং এটি আমাদের <i> শিখতে পার্ল </ i> কোর্সেও রয়েছে।
brian d foy

1

আরেকটি প্রাক -5.14 সমাধান: http://www.perlmonks.org/?node_id=346719 (জ্যাফির পোস্ট দেখুন)

তাঁর পদ্ধতির ব্যবহার হিসাবে mapএটি অ্যারেগুলির জন্যও ভাল কাজ করে তবে mapঅস্থায়ী অ্যারে তৈরি করতে ক্যাসকেডিং প্রয়োজন (অন্যথায় আসলটি সংশোধন করা হবে):

my @orig = ('this', 'this sucks', 'what is this?');
my @list = map { s/this/that/; $_ } map { $_ } @orig;
# @orig unmodified

1

আমি ফু ও বারকে ঘৃণা করি .. যাইহোক প্রোগ্রামিংয়ে এই অ বর্ণনামূলক পদগুলি স্বপ্ন দেখেছিল?

my $oldstring = "replace donotreplace replace donotreplace replace donotreplace";

my $newstring = $oldstring;
$newstring =~ s/replace/newword/g; # inplace replacement

print $newstring;
%: newword donotreplace newword donotreplace newword donotreplace

2
এটি আসল থেকে কীভাবে আলাদা? (এবং আমি মনে করি আপনি চান =~ s))
তিপিম্ম

ক্লাবুটিক ভুল। এই কোডটির আসল আউটপুটটি হলnewword donotnewword newword donotnewword newword donotnewword
পাস্কাল

2
দেখুন ... জোগোটা যদি traditionalতিহ্যবাহী এবং পরিচিত ব্যবহার করত fooএবং bar, তার উত্তরটি সঠিক হত। প্রমাণ করে, আবারও কাস্টমস একটি কারণের জন্য বিদ্যমান এবং পাঠগুলি কেবল কঠোরভাবে শেখা হয়। ;)
জন

-1

আপনি যদি পার্ল দিয়ে লিখেন use strict;তবে আপনি দেখতে পাবেন যে এক লাইনের বাক্য গঠনটি বৈধ নয়, এমনকি ঘোষণার পরেও।

সঙ্গে:

my ($newstring = $oldstring) =~ s/foo/bar/;

তুমি পাও:

Can't declare scalar assignment in "my" at script.pl line 7, near ") =~"
Execution of script.pl aborted due to compilation errors.

পরিবর্তে, আপনি যে সিনট্যাক্সটি ব্যবহার করছেন, লাইন লম্বা থাকাকালীন এটি করার সিনট্যাক্টিক্যালি সঠিক উপায় use strict;। আমার কাছে use strict;এখন ব্যবহার করা ঠিক অভ্যাস is আমি এটি স্বয়ংক্রিয়ভাবে করি। সবার উচিত.

#!/usr/bin/env perl -wT

use strict;

my $oldstring = "foo one foo two foo three";
my $newstring = $oldstring;
$newstring =~ s/foo/bar/g;

print "$oldstring","\n";
print "$newstring","\n";

1
এর use warnings;পরিবর্তে -wআপনি আরও বেশি নিয়ন্ত্রণ অর্জন করতে পারেন: উদাহরণস্বরূপ, যদি আপনি সাময়িকভাবে কোডের একটি ব্লকে সতর্কতা বন্ধ করতে চান।
গ্লেন জ্যাকম্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.